Wie kann ich feststellen, ob eine Variable in C # initialisiert wurde?
Ich weiß, das ist eine dumme Frage und ich denke, es muss haben wurde gebeten, vor. Aber ich bin nicht in der Lage zu finden, eine Antwort auf meine Frage.
Hier finden Sie einige Beispiel-code (was Sie natürlich nicht kompilieren) zu skizzieren, die mein problem:
class test
{
int[] val1;
string val2;
static bool somefunction(test x, test y)
{
dosomestuff()
test result;
while(result is nothing)
{
if(somecondition){result=new test(something);}
}
}
}
Das problem das ich habe, ist in der folgenden Zeile:
while(result is nothing)
Dies ist die syntax von VB, aber das ist natürlich nicht das, was der C# - compiler akzeptiert.
Könnte jemand mir sagen, wie das problem zu beheben?
InformationsquelleAutor der Frage niklasfi | 2009-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die syntax, die Sie suchen, ist:
Sie müssen auch
result = null;
zu starten-auch mitInformationsquelleAutor der Antwort Colin Mackay
TL;DR:
if (Object.Equals(
myVariable
default(
MyVariableType
)))
myVariable
undMyVariableType
.Es gibt andere Lösungen.
if (myVariable == null)
wird nicht arbeiten[1] mit Wert Arten. Die Werttypen sind vor allemenum
Operationen undstruct
s (z.B.DateTime
), einschließlich[2] die einfache Typen wieint
. Wert-Typen nicht unterstützennull
Wert (intrinsisch).Die Ausnahme und die fix sind null-Werte zulässt Arten: im Wesentlichen diese Beurteilung
null
auf die möglichen Werte von einem struct-Typ. Sie sind strukturell die gleichen wie dieMaybe<T>
kennen Sie vielleicht aus anderen Sprachen[3]. Sie erstellen mitValueType?
(z.B.int?
) ist syntaktischer Zucker fürNullable<ValueType>
.Alternativ, anstelle der Verwendung einer nullable-Typ, Sie konnte vergleichen Sie die variable mit Ihrem Typ Standardwert:
(Dies funktioniert für beide Referenztypen (Objekte) und Werttypen.)
Beachten Sie, dass Sie zu ersetzen
MyVariableType
manuell - leider kann man nicht tunweil
default()
akzeptiert nur eine Art Namen direkt (ich nehme an, wertet Sie zur compile-Zeit).Strukturen in einer nussschale
Klassen sind Referenz-Typen: Eine Klasse variable (oder genauer gesagt, seine memory area) enthält nur einen Zeiger auf einen anderen Speicherbereich, wo das aktuelle Objekt-Instanz-Daten gespeichert werden.
Wert Typ Variablen direkt die Daten enthalten. Dies kann die Ausbeute einer Geschwindigkeit profitieren aufgrund cache-Lokalität und speichern Sie die Suche. Aber es kann auch schädlich sein für die Leistung im Fall komplexerer Strukturen.
Fußnoten:
[1] ist Es nicht sogar ein Fehler ausgelöst.
myVariable == null
wird immer nur Ausbeutefalse
weil IhremyVariable
werden initialisiert mit den nicht-null
Standard Wert (null (äquivalent) oder ein struct von Nullen undnull
s). Dieser Wert ist standardmäßig erhältlich mitdefault(Type)
.[2] Technisch zu den einfachen Typen (alle built-in-Typen außer
string
undobject
) sind Strukturen. Anmerkung: Die built-in-Typen sind Aliase für die Typen aus der System namespace.[3] E. g. in Haskell. In C#
Maybe<T>
ist nicht integriert, kann aber umgesetzt werden. Es bietetNothing
als expliziter/self-Dokumentation-version vonnull
sowohl für Klassen und Strukturen.[4] Es gibt keine [4]. Nein, wirklich, Sie können gehen und überprüfen.
InformationsquelleAutor der Antwort Aaron Thoma
InformationsquelleAutor der Antwort Robert Harvey
wenn es das ist was du meinst
InformationsquelleAutor der Antwort satyajit
Obwohl Sie die Antwort haben, Sie sind glücklich mit, es ist etwas, hinter das Sie interessant finden oder hilfreich.
Gibt es einen Unterschied zwischen C# und VB.NET. In VB.NET man kann schreiben:
Und in C# können Sie schreiben:
Sie sind subtil anders. In VB.NET,
b
gegeben wurde, wird der Wert false (in anderen Worten, es wurde bereits initialisiert). In C#b
hat keinen Wert (es ist nicht initialisierten). C# geht zu viel Aufwand, um sicherzustellen, dass Sie können nicht überprüfen Sie den Wert einer Variablen, die noch nie initialisiert wurde.Also Sie sind nicht testen, ob die variable initialisiert wurde. In VB.NET es gibt keine solche Sache wie eine nicht initialisierte variable. In C# ist es unmöglich, den Wert einer nicht initialisierten Variablen, um zu vergleichen, mit nichts.
Testen, ob die variable initialisiert wurde
null
oderNothing
.InformationsquelleAutor der Antwort Daniel Earwicker
Den Gegenwert von nichts in C# ist null.
InformationsquelleAutor der Antwort Supertux
InformationsquelleAutor der Antwort djangofan