VB.NET язык и ничего :почему все так, как есть?
-
06-07-2019 - |
Вопрос
Это вопрос о языке 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
инструкция для присвоения объектов переменным.