<> И не в VB.NET

У меня возникла интересная задача узнать о операторах VB.NET <> и Not. Not - Я предполагаю своим небольшим использованием - это функциональный эквивалент ! в таких языках, как С# и <>, эквивалентный !=.

В VB.NET общая проблема заключается в выполнении булевых выражений в отношении объектов, у которых нет ссылки. Итак, если мы делаем

If Request.QueryString("MyQueryString") <> Nothing Then

Это приведет к сбою, если строка запроса не существует. Почему, я не знаю. Способ, которым он выполнялся старыми кодировщиками, выглядит следующим образом:

If Not Request.QueryString("MyQueryString") Is Nothing Then

И это имеет тенденцию работать. Для меня они функционально эквивалентны, хотя операторы склонны делать разные сравнения, зависящие от определенных факторов, таких как приоритет оператора, почему это не работает в этом случае, однако я не знаю, и я тоже не нашел соответствующего материала.

Я спрашиваю об этом, поскольку мне приходится писать стандартную документацию, и мы определяем использование либо Not, либо <>. Любые идеи о том, каким образом это должно быть, или вы должны это сделать?

Ответы

Ответ 1

Я всегда использовал следующее:

If Request.QueryString("MyQueryString") IsNot Nothing Then

Но только потому, что синтаксически это читается лучше.

При тестировании действительной записи QueryString я также использую следующее:

If Not String.IsNullOrEmpty(Request.QueryString("MyQueryString")) Then

Это только те методы, которые я всегда использовал, поэтому я не мог оправдать их использование, кроме того, что они имеют для меня наибольшее значение при чтении кода.

Ответ 2

Is - это не то же самое, что = - Is сравнивает ссылки, а = будет сравнивать значения.

Если вы используете v2 в .Net Framework (или более поздней версии), есть оператор IsNot, который сделает все правильно и читает более естественно.

Ответ 3

Я думаю, что ваш вопрос сводится к "разнице между (Is и =), а также (IsNot и < > )".

Ответ в обоих случаях одинаковый:

= и <> неявно определены для типов значений, и вы можете явно определить их для своих типов.

Is и IsNot предназначены для сравнения между ссылочными типами, чтобы проверить, ссылаются ли две ссылки на один и тот же объект.

В вашем примере вы сравниваете строковый объект с Nothing (Null), а так как операторы =/<> определены для строк, первый пример работает. Однако это не работает, когда Null встречается, потому что строки являются ссылочными типами и могут быть Null. Лучший способ (как вы уже догадались) - это последняя версия с использованием Is/IsNot.

Ответ 4

Вот технический ответ (расширяющийся на ответ Роуленд Шоу).

Ключевое слово Is проверяет, являются ли оба операнда ссылками на одну и ту же память объекта и возвращает только true, если это так. Я считаю, что это функционально эквивалентно Object.ReferenceEquals. Ключевое слово IsNot - это просто сокращенный синтаксис для написания Not ... Is ..., не более того.

Оператор = (равенство) сравнивает значения и в этом случае (как и во многих других) эквивалентен String.Equals. Теперь оператор < > (неравенство) не имеет такой же аналогии, как и слова Is и IsNot, поскольку он может быть переопределен отдельно от оператора = в зависимости от класса. Я считаю, что всегда должен быть случай, когда он возвращает логический обратный оператор = (и, конечно же, относится к String), и просто позволяет более эффективно сравнивать результаты тестирования для неравенства, а не равенства.

При работе со строками, если вы на самом деле не хотите сравнивать ссылки, всегда используйте оператор = (или String.Equals, я полагаю). В вашем случае, поскольку вы тестируете значение null (Nothing), кажется, вам нужно использовать ключевое слово Is или IsNot (оператор равенства не будет работать, потому что он не может сравнивать значения нулевых объектов). Синтаксически ключевое слово IsNot здесь немного приятнее, поэтому идите с этим.

Ответ 5

Просто используйте, что звучит лучше. Однако я бы использовал первый подход, потому что у него, похоже, меньше операций.

Ответ 6

Если вам нужно знать, существует ли переменная, используйте Is/IsNot Nothing.

Использование < > требует, чтобы переменная, которую вы оцениваете, определила оператор "< > ". Проверьте

 Dim b As HttpContext
 If b <> Nothing Then
    ...
 End If

и результирующая ошибка

Error   1   Operator '<>' is not defined for types 'System.Web.HttpContext' and 'System.Web.HttpContext'.   

Ответ 7

Компиляторы С# и VB.NET часто генерируют разные ИЛ для операций, которые, по-видимому, эквивалентны на обоих языках. Так получилось, что С# делает "ожидаемую" вещь, когда вы пишете stringvar == null, но VB.NET этого не делает. Чтобы получить тот же эффект в VB.NET, вы должны принудительно установить истинное ссылочное равенство с помощью оператора Is.

Ответ 8

Я полный noob, я пришел сюда, чтобы понять, что VB не равен синтаксису, поэтому я решил, что я брошу его здесь, если кому-то это понадобится:

<%If Not boolean_variable%>Do this if boolean_variable is false<%End If%>

Ответ 9

на самом деле Is действительно хорош, так как разработчикам вы можете переопределить оператор ==, чтобы сравнить его со значением. скажем, у вас есть класс A, оператор == of A - это сравнение некоторого поля A с параметром. то у вас возникнут проблемы с С#, чтобы проверить, имеет ли объект A значение null со следующим кодом,

    A a = new A();
...
    if (a != null)
it will totally wrong, you always need to use if((object)a != null)
but in vb.net you cannot write in this way, you always need to write
    if not a is nothing then
or
    if a isnot nothing then

который, как сказал христианин, vb.net ничего не "ожидал".