Язык VB.NET и Ничто: почему это - способ, которым это?

Если вы не знаете (или не заботитесь), сколько аргументов вы будете передавать функции, вы также можете использовать очень простой подход, например:

Код :

function FunctionName()
{
    Write-Host $args
}

Это распечатало бы все аргументы. Например:

FunctionName a b c 1 2 3

Вывод

a b c 1 2 3

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

Вот еще один пример из реальной жизни (создание функции для команды tracert, которую я ненавижу запоминать усеченное имя);

Код :

Function traceroute
{
    Start-Process -FilePath "$env:systemroot\system32\tracert.exe" -ArgumentList $args -NoNewWindow
}
7
задан Sylvain Rodrigue 23 June 2009 в 19:29
поделиться

5 ответов

The problem you're running into is that VB.Net differentiates the 2 types of object comparison. Namely Reference and Value comparison.

The "Is" operator in VB.Net is used for reference comparison. This can be used when the values in question are both reference types or nullables. Attempting to compare value types i this manner will result in a compilation error.

The "=" operator is used for Value comparison. The value comparison can only be used on types which define an explicit =, <> operator pair in their class definition. The actual implementation of the equality depends on the implementation of the operator.

C# takes a different approach in that it uses == for both value and reference comparison. Which is used is dependent upon a couple of factors including the type of the values being compared and the implementation of certain equality methods.

25
ответ дан 6 December 2019 в 05:39
поделиться

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

4
ответ дан 6 December 2019 в 05:39
поделиться

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

3
ответ дан 6 December 2019 в 05:39
поделиться

Другая мысль заключается в том, что 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
ответ дан 6 December 2019 в 05:39
поделиться

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

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

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

1
ответ дан 6 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: