Variablen müssen deklariert werden, um sie verwenden zu können. Die Deklaration muss auf einer Gültigkeitsbereichsebene erfolgen, die noch für die Verwendung gilt. In Ihrem Fall könnten Sie also die Zeichenkette bla
nicht innerhalb der if
deklarieren, da sie außerhalb davon nicht zugänglich wäre, so dass Sie danach bla
nicht verwenden könnten.
Zusätzlich zur Deklaration erfordert der C# -Compiler, dass Sie initialisieren Variablen, bevor Sie auf sie zugreifen können. Dies ist eine Sicherheitsmaßnahme, um sicherzustellen, dass die Variable tatsächlich einen aussagekräftigen Wert von hat. Eine Initialisierung kann eine beliebige gültige Zuweisung sein, einschließlich der richtigen Werte, Dummy-Werte oder des Standardwerts des Typs.
Für Referenztypen, z.B. Strings, ein gemeinsamer Initialisierungswert, der später ersetzt werden würde, wäre null
. Was Sie bereits tun, ist ziemlich üblich.
In Ihrem Fall, da Sie der Variablen nur innerhalb der if
einen Wert zuweisen, aber danach verwenden, müssen Sie die Variable zuerst mit einem Wert initialisieren. Andernfalls sollten Sie Folgendes beachten:
string bla; // not initialized
if (someCondition)
{
bla = "some value";
}
Console.WriteLine(bla);
Wenn someCondition
wahr ist, dann ist alles in Ordnung ist. bla
hat einen tatsächlichen Wert, so dass es gedruckt werden kann. Wenn die Bedingung jedoch nicht erfüllt ist, wird bla
niemals ein Wert zugewiesen - es wird nicht initialisiert. Der Compiler erkennt diese Möglichkeit, dass die Variable niemals initialisiert wird und weist Sie an, sie zu beheben. Also über Code ist nicht erlaubt. Sie müssen die Zeichenfolge bla
zuerst initialisieren, z. mit null
wie du getan hast.
Im Allgemeinen müssen Sie eine Variable immer dann initialisieren, wenn der Compiler Sie dazu auffordert. Wenn es keinen Pfad gibt, in dem eine Variable nicht initialisiert wird, muss sie nicht explizit initialisiert werden. wenn Sie einen else
Fall an den obigen Code beispielsweise hinzugefügt, in dem die Variable einen Wert zugewiesen bekommt, wäre alles in Ordnung sein:
string bla; // not initialized
if (someCondition)
{
bla = "some value";
}
else
{
bla = "some other value";
}
Console.WriteLine(bla);
für Ihr spezielles Problem, einen Wert aus einem Wörterbuch wenn es das Abrufen existiert, könnten Sie Dictionary.TryGetValue
verwenden. Mit dieser Methode können Sie nach einem Schlüssel suchen und den Wert gleichzeitig abrufen. Sie haben also nur eine einzige Wörterbuchsuche. Es verwendet einen out
Parameter den Wert abzurufen, so könnte man es so machen:
string bla;
dictionary.TryGetValue("unknownKey", out bla);
Console.WriteLine(bla);
Beachten Sie, dass seit bla
als out
Parameter übergeben wird, Sie es nicht initialisieren müssen. Dies liegt daran, dass Methoden, die einen out
-Parameter verwenden, bereits erforderlich sind, um sie zu initialisieren. Selbst wenn der Schlüssel nicht im Wörterbuch vorhanden ist, hat bla
einen initialisierten Wert. Im Fall von TryGetValue
empfängt es dann den Standardwert des Typs (für Zeichenfolgen ist dies null
).
Natürlich, desto verbreiteter Gebrauch ist der Rückgabewert von TryGetValue
zu verwenden, ein Feedback zu bekommen, ob ein Schlüssel existiert, wie Sie es aus dem Wörterbuch abrufen:
string bla;
if (dictionary.TryGetValue("unknownKey", out bla))
{
// key existed
// do something with bla
}
Sie erstellen können 'Dictionary defaultDictionary = new Dictionary {{"unknownKey", "unknownValue"}, ...}; 'und eine Hilfsmethode' string GetValue (string key) {if (myDictionary.Contains (key)) {return myDictionary [Schlüssel]; } return defaultDictionary [Schlüssel]; } ' –
Anton
Es ist immer erforderlich, * die Variable * zu deklarieren. Es ist außerdem notwendig * die Variable * zu initialisieren, wenn die Variable andernfalls nicht initialisiert würde (z. B. wenn die Bedingung in Ihrem Fall nicht wahr ist). Der Compiler wird dies erfordern und Ihnen sagen, wann immer Sie es vergessen. Die Antwort lautet also: Es ist notwendig, wenn der Compiler es benötigt. – poke
zu Pokes hinzufügen Antwort: Sie initialisieren es. Mit Null. Dies ist absolut gültig. – fixagon