Was bewirkt die Zuweisung von Variablen zu null?

7

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%     
Jive Boogie 15.03.2012, 17:52
quelle

6 Antworten

12

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

erreichen

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.

    
JaredPar 15.03.2012, 17:56
quelle
5

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.

    
xandercoded 15.03.2012 17:55
quelle
4

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

%Vor%

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.

    
Adam Mihalcin 15.03.2012 17:53
quelle
2

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.

    
Moo-Juice 15.03.2012 17:55
quelle
1

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:

  1. Wenn Sie kommentiert haben, initialisieren Sie 'match' vor der for-Schleife.
  2. Hinzufügen einer Standardbedingung 'else' nach der for-Schleife.

Zum Glück, wenn Sie an einer IDE arbeiten, weist Sie dies auf eine Kompilierausnahme hin.

    
raTM 15.03.2012 17:57
quelle
0

Wenn Sie type variable = null; angeben, initialisieren Sie die Variable. Wenn Sie type variable; angeben, deklarieren Sie nur die Variable.

    
user5398447 15.03.2012 17:54
quelle

Tags und Links