Wartość domyślna dla typów ogólnych


Jak stworzyć domyślny wagon w VB? w C # mogę zadzwonić:
T variable = default(T);

  • Jak to zrobić w VB
  • Jeśli po prostu zwróci wartość null (C #) lub nic (vb), to co się stanie z typami wartości
  • Czy istnieje sposób określenia wartości domyślnej dla typu niestandardowego Na przykład, co zrobić, jeśli chcę, aby wartość domyślna była równoważna wywołaniu konstruktora bez parametrów w mojej klasie.

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Pytanie 1:
>
Dim variable As T
' or '
Dim variable As T = Nothing
' or '
Dim variable As New T()

Zauważ, że to drugie działa tylko wtedy, gdy ustawisz ograniczenie
Structure
na typ ogólny (dla typów referencyjnych
New T ()
w VB robi coś innego niż
default ( T)
w C #).

Pytanie 2:
>
W przypadku typów wartości wszystkie elementy składowe struktury są „zerowane”, to znaczy wszystkie elementy członkowskie typu referencyjnego mają wartość
null
(
Nothing
), a wszystkie typy wartości w kolei, są unieważnione ...
I nie, ponieważ
string
jest typem referencyjnym, tak nie jest
daje w wyniku
„”
dla ciągów, jak zasugerowano w innej odpowiedzi.

Pytanie 3:
>
Nie, nie ma sposobu, aby to wyjaśnić. Jest już kilka tematów na ten temat w Stack Overflow, na przykład

tutaj
https://coderoad.ru/333829/... John wysłał

świetne wyjaśnienie
https://coderoad.ru/333829/
dlaczego tak jest.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Właściwie, ludzie, poprawnym sposobem na zrobienie tego jest rzutowanie
null
(
Nothing
) jako swojego typu ogólnego w następujący sposób:
Dim tmpObj As T = CType(Nothing, T)

Jeśli chcesz zwrócić wartość domyślną dla generycznej, po prostu zwróć
CType (Nothing, T)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie będąc właściwie facetem od VB, popełniłem kilka błędów w mojej oryginalnej odpowiedzi, że Konrad mnie wyprostował. Oryginalna odpowiedź znajduje się poniżej, ale chciałem zaktualizować moją odpowiedź, aby była poprawna, na podstawie informacji Konrada.
Jak mówi Konrad,
default (T)
i
Nothing
są w rzeczywistości równoważne zarówno dla wartości, jak i typów referencyjnych. Prawidłowy kod VB powinien wyglądać następująco, w takim przypadku otrzymasz dokładnie to samo zachowanie, co w moim kodzie C #:
Function ReturnSomething(Of T)() As T
Return Nothing
End FunctionFunction DoSomething(Of T)()
Dim x as T = Nothing;
If x = Nothing Then
Console.WriteLine("x is default.")
Else
Console.WriteLine("x has a value.")
End If


Oryginalna (ZŁA) odpowiedź
>
Wygląda na to, że nie ma odpowiednika
default (T)
w VB. Jednak według

ten post
http://blog.somecreativity.com ... bnet/
w przeciwieństwie do C #, jeśli
T
jest typem wartości, w VB nadal możesz używać
Nothing
, co jest semantycznie takie samo w większości przypadków.
Dużym miejscem, w którym napotkasz problemy z użyciem
Nothing
, w którym zwykle używasz
default (T)
, jest sytuacja, gdy musisz przetestować go w swoim kodzie. Rozważmy następujący kod C #:
T ReturnSomething<T>()
{
return default(T);
}void DoSomething<T>()
{
T x = default(T);
if(x == default(T))
Console.WriteLine("x is default.");
else
Console.WriteLine("x has a value.");
}

Przetłumaczone na VB w ten sposób:
Function ReturnSomething(Of T)() As T
Return Nothing
End FunctionFunction DoSomething(Of T)()
Dim x as T = Nothing;
If x Is Nothing Then
Console.WriteLine("x is default.")
Else
Console.WriteLine("x has a value.")
End If
End Function

Jeśli
T
jest typem referencyjnym, obie wersje będą działać dokładnie tak samo zarówno dla
ReturnSomething
, jak i
DoSomething
. Jeśli jednak
T
jest typem wartości, wówczas
ReturnSomething
będzie działać dokładnie tak samo dla każdego języka, ale
DoSomething
wypisze „x jest wartością domyślną”. " w wersji C # i „x ma wartość”. w wersji VB.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się