I patrząc na niektóre kodu i przyszedł acorss to:Ciąg <> Nic i ciąg <> "" Nadmiarowe w VB .NET?
Dim TestString As String
...
If TestString <> Nothing And TestString <> "" Then
...
EndIf
Czy oba warunki sprawdzianów samo?
Dzięki
I patrząc na niektóre kodu i przyszedł acorss to:Ciąg <> Nic i ciąg <> "" Nadmiarowe w VB .NET?
Dim TestString As String
...
If TestString <> Nothing And TestString <> "" Then
...
EndIf
Czy oba warunki sprawdzianów samo?
Dzięki
Sprawdzają próbkowanie, ale MOGĄ być oznaczać, aby sprawdzić różne rzeczy.
If IsNothing(TestString) Then
I
If TestString = Nothing Then
są różne testy - pierwszy jest rzadko używane, ponieważ typicaly tylko naprawdę chce wiedzieć, czy to ma niepusty wartość. Ale może być używany do traktowania pustego ciągu i wartości null inaczej w DB, lub do wykrywania użycia opcjonalnego parametru (oba przypadki wymagają dodatkowej pracy, aby upewnić się, że nie przypadkowo poślizgniesz się w niewłaściwej wartości, więc nieco kruchy).
W podanym przykładzie, badanie jest rzeczywiście nieco rozwlekły i mylące, jeśli to, co chcesz przetestować następnie Jeśli string.IsNullOrEmpty (TestString) Następnie
jest sposób się do tego zabrać. Jeśli to "i" miało być "lub", to może mieć sens używanie IsNothing (TestString).
Nothing
byłoby żadnych znaków na wszystkich (null
w innych językach), który jest inny niż pusty ciąg (""
), który jest faktycznie ciągiem.
Czek należy jednak zastąpić numerem If Not String.IsNullOrEmpty(TestString) Then
, dzięki czemu jest bardziej zrozumiałe, co dokładnie robisz.
Po prostu bawiłem się tym trochę w LINQPad i odkryłem coś lekko zaskakującego. W VB.NET:
Dim s1 as string = Nothing
Dim s2 as string = ""
Console.WriteLine(s1 is Nothing) 'True
Console.WriteLine(s2 is Nothing) 'False
Console.WriteLine(s1 = "") 'True
Console.WriteLine(s2 = "") 'True
Console.WriteLine(string.IsNullOrEmpty(s1)) 'True
Console.WriteLine(string.IsNullOrEmpty(s2)) 'True
w C#:
string s1 = null;
string s2 = "";
Console.WriteLine(s1 == null); //True
Console.WriteLine(s2 == null); //False
Console.WriteLine(s1 == ""); //False
Console.WriteLine(s2 == ""); //True
Console.WriteLine(string.IsNullOrEmpty(s1)); //True
Console.WriteLine(string.IsNullOrEmpty(s2)); //True
I nie dość, że spodziewa. Wygląda na to, że VB.Net traktuje Nothing
jako pusty ciąg. Zgaduję, że chodzi o kompatybilność ze starszymi wersjami VB.
To wzmacnia, tym bardziej, że powinieneś używać tego rodzaju kontroli, ponieważ jest bardziej jednoznaczny, co sprawdzasz i działa zgodnie z oczekiwaniami.
Tak, zgodnie z definicją w VB.NET ""
jest równoważna Nothing
tym dla =
, <>
i wszystkich VB funkcji; chyba że wyraźnie dbasz o różnicę, na przykład sprawdzając pod numerem Is
.
Oczywiście różnice będą widoczne podczas używania ogólnych funkcji .NET, a zwłaszcza metod, w których str.Method
zakończy się niepowodzeniem z wyjątkiem odwołania do wartości Null.
BTW Zgaduję, że fragment w OP jest kod C# (źle) konwertowane.
+1 ukradłem słowa z moich ust. Erich, jeśli ciąg nie został ustawiony, to nic, jeśli ciąg znaków = "" jest pusty. –
Jestem całkowicie zdezorientowany. W MSDN mówi, że dla zmiennych typu String w VB, Nothing = "". Jeśli tak jest, wydaje się, że powyższe jest zbędne. –
Zgaduję, że to by było zrobione przez kogoś, kto był bardziej obeznany z C#, który ma inne zachowanie i nie wie o IsNullOrEmpty. –