Der Standardwert für Generika

stimmen
18

Wie erstelle ich den Standard für eine generische in VB? in C # kann ich nennen:

T variable = default(T);
  1. Wie kann ich tun dies in VB?
  2. Wenn diese wieder nur null (C #) oder nichts (vb) dann, was zu Werttyp geschieht?
  3. Gibt es eine Möglichkeit für einen benutzerdefinierten Typ festgelegt, welche der Standardwert ist? So was, wenn ich der Standardwert zu sein, das entspricht der Aufruf einen parameterlosen Konstruktor auf meiner Klasse will.
Veröffentlicht am 09/12/2008 um 21:32
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
23

Frage 1:

Dim variable As T
' or '
Dim variable As T = Nothing
' or '
Dim variable As New T()

Beachten Sie, dass diese funktioniert nur , wenn Sie die angeben StructureEinschränkung für den generischen Typen (für Referenztypen New T()in VB tut etwas anderes als default(T)in C #).

Frage 2:

Für Werttypen alle Mitglieder der struct werden „genullt“, dh alle Mitglieder Referenztyps eingestellt sind null( Nothing) und alle Werttypen wiederum ausgenullt.

Und nein, da stringein Referenztyp ist, ist es nicht ergibt ""für Streicher wie in der anderen Antwort vorgeschlagen.

Frage 3:

Nein, es gibt keine Möglichkeit , dies zu spezifizieren. Es gibt einige Threads dazu auf Stack - Überlauf bereits, zB hier . Jon hat eine gepostet ausgezeichnete Erklärung , warum dies.

Beantwortet am 09/12/2008 um 21:34
quelle vom benutzer

stimmen
5

Eigentlich Leute der richtige Weg , dies zu tun , ist die werfen null( Nothing) Typen als generischen Typs wie folgt:

Dim tmpObj As T = CType(Nothing, T)

Wenn Sie den Standardwert für die allgemeine Rückkehr Sie einfach zurückgeben CType(Nothing, T)

Beantwortet am 18/12/2009 um 17:14
quelle vom benutzer

stimmen
0

Nicht wirklich ein VB Kerl zu sein, ich habe einige Fehler gemacht in meiner ursprünglichen Antwort, die Konrad mich gerade am Set. Die ursprüngliche Antwort ist unten, aber ich wollte meine Antwort aktualisieren, basierend auf Konrads Eingabe korrekt.

Wie Konrad sagt, default(T)und Nothingist für beiden Werte und Referenztypen in der Tat äquivalent. Der richtige Code VB sollte wie folgt in dem Fall , dass Sie genau das gleiche Verhalten bekommen würden Sie in meinem C # -Code erhalten:

Function ReturnSomething(Of T)() As T
    Return Nothing
End Function

Function 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

Original (FALSCH) Antwort

Es sieht aus , als ob es kein VB entspricht ist default(T). Doch nach diesem Beitrag , anders als in C #, wenn Tein Werttyp ist, in VB können Sie immer noch verwenden , Nothingdie in den meisten Fällen semantisch gleich ist.

Der große Platz , in dem Sie ein Problem haben würden mit Nothingdem Sie normalerweise verwenden würden default(T), wenn Sie es in Ihrem Code testen müssen. Betrachten Sie den folgenden C # -Code:

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.");
}

Übersetzt wie folgt VB:

Function ReturnSomething(Of T)() As T
    Return Nothing
End Function

Function 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

Wenn Tein Referenztyp ist, wirken beide Versionen genau das gleiche für beide ReturnSomethingund DoSomething. Wenn jedoch Tein Werttyp ist, ReturnSomethingwirkt genau das gleiche für beide Sprache, sondern DoSomethingdruckt „x Standard ist.“ in der C # Version, aber "x hat einen Wert." in der VB - Version.

Beantwortet am 09/12/2008 um 22:12
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more