Im folgenden bekomme ich einen Kompilierzeitfehler, der besagt, dass die Verwendung von nicht zugewiesenen lokalen Variablen 'übereinstimmt' wenn ich nur string match eingib; aber es funktioniert, wenn ich string match = null verwende; Also was ist der Unterschied und im Allgemeinen, wenn eine Zeichenfolge nicht sofort einen Wert zugewiesen wird, sollte ich auf Null wie folgt zuweisen?
%Vor% Die C # -Sprache verhindert die Verwendung einer lokalen Sprache, bis ihr definitiv ein Wert zugewiesen wurde. In diesem Beispiel versteht der Compiler die Semantik von Split
nicht und muss davon ausgehen, dass strArr
eine leere Auflistung sein kann und daher der Rumpf der Schleife möglicherweise nicht ausgeführt werden kann. Dies bedeutet, dass foreach
aus einer definitiven Zuordnungsperspektive match
keinen Wert zuweist. Daher ist es immer noch nicht zugewiesen, wenn Sie WriteLine
Wenn Sie die Deklaration in string match = null
ändern, wird der Wert von Anfang an als eindeutig zugewiesen markiert. Die Schleifenberechnung spielt also keine Rolle.
Hängt jedoch von Ihrem Szenario ab:
%Vor%Oder:
%Vor%sind beide akzeptable Praktiken.
In Ihrem Fall ist es möglich, dass match
niemals einen Wert zugewiesen hat, daher der Compilerfehler.
Sie finden den Unterschied zwischen Deklaration und Zuweisung. Deklaration, mit Zeilen wie
%Vor% deklariert einfach dem Compiler, dass Sie eine Variable match
vom Typ string verwenden werden. Zuweisung, mit Zeilen wie
weist den Wert null
zu match
zu.
Es ist möglich, dass eine Sprache deklariert, dass die Deklaration und die Zuweisung immer getrennt sein müssen (ich bin nicht 100% sicher, aber ich glaube, dass alte Versionen von Visual Basic dies getan haben), aber die meisten Sprachen erlauben Deklaration und Zuordnung, Schreiben
%Vor%bedeutet
%Vor% C # erfordert, dass Variablen zugewiesen werden, bevor sie verwendet werden. Im Gegensatz zu Feldern und Ereignissen werden lokalen Variablen nicht automatisch Standardwerte zugewiesen. Daher müssen Sie dem Compiler beweisen, dass match
einen Wert hat, bevor Sie match
verwenden. Dem Compiler ist es egal, welchen Wert match
hat, solange diese Variable vom Typ String ist.
In Ihrem Fall kann der Compiler mit der lokalen Analyse nicht beweisen, dass strArr
nicht leer ist, da der Compiler den Code von Split
nicht überprüft, so dass es keine Garantie gibt, dass der Code auch nur foreach
loop, lass die Bedingung erfüllen, um match
zuzuweisen. Da der Aufruf Console.WriteLine
match
verwendet und da match
zur Laufzeit nicht mit der Deklaration string match
zugewiesen werden kann, müssen Sie dem Compiler match
außerhalb der Schleife zuweisen. Eine Möglichkeit, die Anforderung zu erfüllen, besteht darin, string match = null
anstelle von string match
zu verwenden.
Der Compiler hat erkannt, dass Sie match
verwenden können, ohne dass ihm jemals etwas zugewiesen wird. Die foreach
-Schleife kann niemals ausgeführt werden. Sie haben also die Variable deklariert, aber der Compiler hat erkannt, dass auf sie zugegriffen werden kann, ohne dass sie jemals zugewiesen wurde, daher der Fehler.
Sie haben den Block if (), der die Variable 'match' initialisiert, wenn die Bedingung erfüllt ist. In diesem Fall ist die Übereinstimmung ein Objekt, das den tatsächlichen Block im Speicher darstellt.
Wenn jedoch die Bedingung if () nicht erfüllt ist, gibt es keinen else-Block, der eine Standardinitialisierung der Variable 'match' vornimmt. In diesem Fall versuchen Sie, auf ein nicht initialisiertes Objekt zuzugreifen , die fehlschlagen würde.
Sie können dies umgehen, indem Sie:
Zum Glück, wenn Sie an einer IDE arbeiten, weist Sie dies auf eine Kompilierausnahme hin.
Wenn Sie type variable = null;
angeben, initialisieren Sie die Variable. Wenn Sie type variable;
angeben, deklarieren Sie nur die Variable.
Tags und Links c#