Wie kann man feststellen, ob eine Variable in C#initialisiert wurde?
Frage
Ich weiß, dass dies eine dumme Frage ist und ich denke, es muss schon einmal gestellt worden sein. Ich kann jedoch keine Antwort auf meine Frage finden.
Hier ist ein Beispielcode (der natürlich nicht kompiliert wird), um mein Problem zu skizzieren:
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, was natürlich nicht das ist, was der C# Compiler akzeptiert. Könnte mir jemand sagen, wie ich das Problem lösen kann?
Lösung
Die Syntax, nach der Sie suchen, ist:
while (result == null)
Sie müssen auch einstellen result = null;
Anfang auch mit
Andere Tipps
Tl; dr:
if (Object.Equals(
myVariable
, default(
MyVariableType
)))
- Ersetzen
myVariable
undMyVariableType
.
Es gibt andere Lösungen.- Ersetzen
if (myVariable == null)
Wille nicht arbeiten[1] mit Wert Typen. Die Werttypen sind hauptsächlich struct
s (zB DateTime
), einschließlich[2] das einfache Typen wie int
, und enum
Erationen. Werttypen unterstützen nicht a null
Wert (intrinsisch).
Die Ausnahme und die Fix dafür sind Nullbar Typen: Im Wesentlichen addieren diese null
zu den möglichen Werten eines Strukturarts. Sie sind strukturell gleich wie die Maybe<T>
Sie wissen vielleicht aus anderen Sprachen[3]. Sie erstellen sie mit ValueType?
(z.B int?
) das ist syntaktischer Zucker für Nullable<ValueType>
.
Alternativ können Sie Ihre Variable mit dem Standardwert seines Typs, anstatt einen nullierbaren Typ zu verwenden, vergleichen:
if (Object.Equals(myVariable, default(MyVariableType)))
(Dies funktioniert sowohl für Referenztypen (Objekte) als auch für Werttypen.)
Beachten Sie, dass Sie ersetzen müssen MyVariableType
manuell - leider können Sie nicht tun
if (Object.Equals(myVariable, default(myVariable.GetType())))
Weil default()
Akzeptiert nur einen Typnamen direkt. (Ich nehme an, es bewertet es zur Kompilierungszeit.)
Strukturen kurzgesagt
Einfach gesagt, Strukturen sind abgeschnittene Klassen. Stellen Sie sich Klassen vor, die die Erbschaft oder Finalizer nicht unterstützen, und Sie haben die abgeschnittene Version: die Struktur. Strukturen sind auf die gleiche Weise wie Klassen definiert (außer mit dem
struct
Schlüsselwort) und abgesehen von den gerade beschriebenen Einschränkungen können Strukturen die gleichen reichen Mitglieder haben, einschließlich Feldern, Methoden, Eigenschaften und Operatoren.
Zitiert von: http://www.albahari.com/valuevsrefttypes.aspx ]
Klassen sind Referenztypen: Eine Klassenvariable (oder genauer gesagt ihren Speicherbereich) enthält nur einen Zeiger auf einen anderen Speicherbereich, in dem die tatsächlichen Objektinstanzdaten gespeichert sind.
Werttyp Variablen enthalten die Daten direkt. Dies kann zu einem Geschwindigkeitsvorteil aufgrund von Cache -Lokalität und die Suche retten. Es kann jedoch auch nachteilig auf die Leistung bei komplexeren Strukturen sein.
Fußnoten:
1] Es macht nicht einmal einen Fehler. myVariable == null
wird immer nur geben false
, weil du myVariable
wird mit dem Nicht initialisiertnull
Ursprünglich Wert (Null (Null)Äquivalent) oder eine Struktur von Nullen und null
s). Dieser Standardwert ist mit verfügbar default(Type)
.
2] Technisch gesehen die einfachen Typen (alle eingebaute Typen außer string
und object
) sind Strukturen. Randnotiz: Die eingebauten Typen sind Aliase für Typen aus der System Namespace.
3] zB in Haskell. In C# Maybe<T>
ist nicht integriert, kann aber implementiert werden. Es bietet Nothing
als explizitere/selbstdokumentierende Version von null
sowohl für Klassen als auch für Strukturen.
4] Es gibt keine [4]. Nein wirklich, du kannst gehen und überprüfen.
while (result == null)
while (result ==null )
Wenn du das meinst
Obwohl Sie eine Antwort haben, mit der Sie zufrieden sind, steckt etwas dahinter, dass Sie interessant oder hilfreich sind.
Es gibt einen Unterschied zwischen C# und vb.net. In vb.net können Sie schreiben:
Dim b as Boolean
Und in C# können Sie schreiben:
bool b;
Sie sind subtil anders. In vb.net, b
wurde der Wert falsch gegeben (mit anderen Worten, er wurde bereits initialisiert). In C#, b
hat keinen Wert (es ist nicht initialisiert). C# bemüht sich sehr, sicherzustellen, dass Sie den Wert einer Variablen, die noch nie initialisiert wurde, nicht untersuchen können.
Sie testen also nicht, ob die Variable initialisiert wird. In VB.NET gibt es keine nicht initialisierte Variable. In C# ist es unmöglich, den Wert einer nicht initialisierten Variablen zu erhalten, um sie mit irgendetwas zu vergleichen.
Sie testen, ob die Variable initialisiert wurde null
oder Nothing
.
while(result == null)
Das Äquivalent von nichts in C# ist null.
while (result == null)