2016-08-23 17 views
3

Vielleicht eine dumme Frage, aber was ist Syntax weise den Weg in C# zu gehen? Wenn ich Werte aus einem Wörterbuch abrufe und nicht sicher bin, ob sie existieren, muss ich diese vorher deklarieren, wenn sie existieren, kann ich später m verwenden?Sind vordeklarierende Variablen immer notwendig?

Beispiel (Ich brauche in den Code ‚String bla‘ verwenden später):

string bla = null; 
if (myDictionary.ContainsKey("unknownKey")) 
{ 
    bla = myDictionary["unknownKey"]; 
} 

if (bla != null) { etc etc etc } 

ich viele Elemente in einem Wörterbuch zu überprüfen haben, auch einige komplexere Typen, so dass gonna sei eine ziemlich große Voranmeldung ...

Aber ich denke, in diesem Fall die Frage zu stellen ist es zu beantworten ... Cheerz!

+0

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

+0

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

+1

zu Pokes hinzufügen Antwort: Sie initialisieren es. Mit Null. Dies ist absolut gültig. – fixagon

Antwort

5

Für Sachen wie, dass Ich mag Erweiterungsmethoden verwenden:

public static class DictionaryExtensions 
{ 
    public static T1 ValueOrDefault<T, T1>(this IDictionary<T, T1> dictionary, T key) 
    { 
     if (key == null || dictionary == null) 
      return default(T1); 

     T1 value; 
     return dictionary.TryGetValue(key, out value) ? value : default(T1); 
    } 
} 

Dann können Sie es wie folgt verwenden:

var bla = myDictionary.ValueOrDefault("unknownKey"); 
+0

Dies kann eine gute Möglichkeit, den Wert abzurufen, aber es beantwortet die Frage nicht überhaupt (ob oder wann es notwendig ist). – poke

+2

Es ist ein Fehler imo, dem Wörterbuch den Wert null zu geben. Normalerweise würde das Aufrufen von Methoden für eine NULL-Referenz eine Ausnahme auslösen, aber es gibt diese Erweiterungsmethode, die das Problem tatsächlich (sozusagen) auslassen kann, aber das scheint trotzdem falsch zu sein. – Silvermind

+0

@poke Ich interpretierte das Ziel von Ronald, auf das Wörterbuch zugreifen zu können, ohne zu prüfen, ob der Schlüssel zuerst im Wörterbuch vorhanden ist. Eine Möglichkeit wäre, die Werte auf einen Standardwert zu setzen. Ich würde empfehlen, dies zu tun und stattdessen eine solche Erweiterungsmethode zu verwenden, die den Code verbirgt, um nach einem vorhandenen Schlüssel zu suchen und den Code lesbarer zu machen. Natürlich können Sie der Erweiterungsmethode auch einen eigenen Standardwert hinzufügen. – fknx

3

ich diesen

if (myDictionary.ContainsKey("unknownKey")) 
    { 
     var bla = myDictionary["unknownKey"]; 
     //etc etc etc 
    } 
    else 
    { 
     //your code when the key doesn't exist 
     //sometimes this else is useless 
    } 
lieber

Beachten Sie, dass das Wörterbuch (K, V) Nullwerte haben kann! Stellen

myDictionary.Add("unknownKey", null); 

EDIT Allgemein gesprochen, die Überprüfung bla == null nicht das gleiche wie myDictionary.ContainsKey ist da noch der Wert null auch der Schlüssel vorhanden sein kann. Für eine bessere Leistung sollten Sie immer .TryGetValue wie folgt verwenden:

string bla; 
    if (myDictionary.TryGetValue("unknownKey", out bla)) 
    { 
     //the key exists 
    } 
    else 
    { 
     //the key doesn't exist 
    } 
+0

Dies erfordert 2 Suchvorgänge, wobei 1 ausreicht. TryGetValue() könnte dies lösen und den Unterschied zwischen nicht gefunden und gefunden-null machen. –

+0

@HenkHolterman Aber '1 Nachschlagen' ist' O (1) '. 'TryGetValue()' ist großartig, sieht aber hässlich aus, weil Sie die 'out'-Variable außerhalb des Bereichs deklarieren müssen, wie das, was OP in der Frage getan hat. –

+0

@HenkHolterman Die schönste Lösung wird in C# 6 RC, 'myDictionary.TryGetValue (" Schlüssel ", out var bla), entfernt, das ist schade. –

1

Es scheint, dass niemand Ihre Frage tatsächlich beantwortet hat.

Ja, Vordeklarierung der Variablen ist immer notwendig. Was Sie wählen können, ist der Umfang der Variablen, aber wenig anderes.

Zum Beispiel wäre dies eine Alternative sein:

if (myDictionary.ContainsKey("unknownKey")) 
{ 
    var bla = myDictionary["unknownKey"]; 

    if (bla != null) { etc etc etc } 
} 

var bla = "someother string"; //valid because previous bla declaration is out of scope. 

C# erfordert, dass alle Variablen und initialisiert deklariert werden, bevor sie verwendet werden. Manchmal wird die Initialisierung automatisch für Sie durchgeführt (Instanzfelder), aber Sie müssen sie nicht deklarieren.

+0

@poka duh! ja dank. – InBetween

1

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 
} 
Verwandte Themen