<> И не в VB.NET - PullRequest
       29

<> И не в VB.NET

21 голосов
/ 16 марта 2009

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

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

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

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

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

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

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

Ответы [ 9 ]

31 голосов
/ 16 марта 2009

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

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

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

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

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

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

10 голосов
/ 16 марта 2009

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

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

7 голосов
/ 16 марта 2009

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

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

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

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

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

1 голос
/ 16 марта 2009

Вот технический ответ (подробнее об ответе Роуленда Шоу).

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

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

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

0 голосов
/ 22 июня 2013

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

    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 ничего не "ожидал".

0 голосов
/ 01 апреля 2013

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

<%If Not boolean_variable%>Do this if boolean_variable is false<%End If%>
0 голосов
/ 28 июля 2009

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

0 голосов
/ 16 марта 2009

Если вам нужно узнать, существует ли переменная, используйте 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'.   
0 голосов
/ 16 марта 2009

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

...