Вопрос

Это вопрос о языке 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 = Ничего.

Почему VB.NET авторы просто думали обратное ?Есть какой - нибудь намек ?

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Ну, в некоторых случаях вы можете написать 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 выполняет эталонное сравнение (проверка того, являются ли сравниваемые объекты одним и тем же экземпляром), в то время как знак равенства является сравнение значений.

Другая мысль заключается в том, что 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.Сетевой код?Это еще одна возможная причина разницы.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top