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?

War es hilfreich?

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 und MyVariableType.


    Es gibt andere Lösungen.


if (myVariable == null) Wille nicht arbeiten[1] mit Wert Typen. Die Werttypen sind hauptsächlich structs (zB DateTime), einschließlich[2] das einfache Typen wie int, und enumErationen. 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 nulls). 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top