Язык VB.NET и ничего: почему это так? - PullRequest
7 голосов
/ 23 июня 2009

Это вопрос о языке VB.NET. Поскольку я использую его каждый день, я просто пытаюсь понять мотивы, лежащие в основе некоторых его конструкций.

Я просто узнаю, что эта строка:

If myObject Is Nothing then

так же правильно, как этот:

If Nothing Is myObject Then

Те же результаты. Используя ildasm, мы видим, что эти строки переведены на:

if myObject = null then

и

if null = myObject then

Хорошо, но в VB.NET вы не можете написать:

if myObject = Nothing Then

Компилятор не примет это.

Ммм, для меня Если ничто не myObject гораздо менее очевидно, чем Если myObject = Ничего .

Почему авторы VB.NET думают об обратном? Любой намек?

Ответы [ 5 ]

25 голосов
/ 23 июня 2009

Проблема, с которой вы сталкиваетесь, заключается в том, что VB.Net различает два типа сравнения объектов. А именно эталонное и ценностное сравнение.

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

Оператор "=" используется для сравнения значений. Сравнение значений может использоваться только для типов, которые определяют явную пару операторов =, <> в своем определении класса. Реальная реализация равенства зависит от реализации оператора.

C # использует другой подход в том смысле, что он использует == как для сравнения значений, так и для сравнения. То, что используется, зависит от нескольких факторов, включая тип сравниваемых значений и реализацию определенных методов равенства.

4 голосов
/ 23 июня 2009

Это одна из этих вещей, унаследованных от VB6 и COM. VB6 проводит различие между объектами ссылочных типов (которые могут быть созданы) и нативными типами, такими как int. Ссылочные типы должны были быть созданы и назначены с помощью оператора «Set», тогда как нативные типы просто использовали «=».

3 голосов
/ 23 июня 2009

Ну, в некоторых случаях вы можете написать If myObject = Nothing Then, но это не будет нулевым сравнением:

Dim someValue As Integer
If someValue = Nothing Then
    ' do something '
End If

Приведенный выше код эквивалентен следующему:

Dim someValue As Integer
If someValue = 0 Then
    ' do something '
End If

В этом случае у вас есть тип значения, у которого есть его значение "emtpy" (0 для Integer, Point.Empty для структуры Point в качестве примеров). Оператор Is выполняет сравнение ссылок (проверяет, являются ли сравниваемые объекты одним и тем же экземпляром), а знак равенства - сравнение значений .

1 голос
/ 23 июня 2009

Еще одна мысль о том, что VB должен быть более многословным, если вы посмотрите на цикл и условный синтаксис. Пара примеров:

VB:

If x==0 Then
End If

While 
End While

For i = 0 to 10 Step 2
Next i

C #

 If x==0 
 {
 }

 While 
 {
 }

 for (int i = 0; i<=10;i+2)
 {
 }

Видите все дополнительные слова в коде VB.Net? Это еще одна возможная причина разницы.

1 голос
/ 23 июня 2009

Использование Is Nothing - это конструкция, которая восходит ко временам классической Visual Basic (то есть 6.0 и ниже).

Для обеспечения некоторой совместимости (точно так же, как VB6 обрабатывает не ленивую оценку оператора If), это было перенесено в VB.NET.

К счастью, как указывает ocdecio , были и другие подобные peccadillos, которые не были перенесены в VB.NET, такие как оператор Set для назначения объектов переменным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...