2008-09-04 9 views
3

Dies ist eine ziemlich triviale Angelegenheit, aber ich bin neugierig, die Meinungen der Leute darüber zu hören.Der beste Weg, um eine Eigenschaft zu verwenden, um ein Schlüssel-Wert-Paar in einem Wörterbuch zu referenzieren

Wenn ich ein Wörterbuch habe, auf das ich über Eigenschaften zugreife, welche dieser Formate würden Sie für die Eigenschaft bevorzugen?

/// <summary> 
/// This class's FirstProperty property 
/// </summary> 
[DefaultValue("myValue")] 
public string FirstProperty { 
    get { 
     return Dictionary["myKey"]; 
    } 
    set { 
     Dictionary["myKey"] = value; 
    } 

Dies ist wahrscheinlich der typische Weg, dies zu tun. Es ist ziemlich effizient, leicht zu verstehen, etc. Der einzige Nachteil mit einem Schlüssel mehr oder komplexer ist es möglich wäre es falsch schreiben oder nur eine Instanz oder etwas ändern, um mich zu diesem führenden:

/// <summary> 
/// This class's SecondProperty property 
/// </summary> 
[DefaultValue("myValue")] 
private const string DICT_MYKEY = "myKey" 
public string SecondProperty { 
    get { 
     return Dictionary[DICT_MYKEY]; 
    } 
    set { 
     Dictionary[DICT_MYKEY] = value; 
    } 

Welche ist etwas komplizierter, scheint aber zusätzliche Sicherheit zu bieten und ist näher an dem, was ich als "Code Complete" -Lösung bezeichnen würde. Der Nachteil ist, dass, wenn Sie auch einen Block /// und einen Block [DefaultValue()] über der Eigenschaft bereits haben, es beginnt ein bisschen überfüllt dort oben.

Also was magst du besser und warum? Hat jemand bessere Ideen?

Antwort

4

Ich mag die zweite, weil jede Vermeidung von magischen Strings/Zahlen im Code eine gute Sache ist. IMO, wenn Sie mehr als einmal auf eine Zahl oder ein Zeichenfolgenliteral im Code verweisen müssen, sollte es eine Konstante sein. In den meisten Fällen, auch wenn es nur einmal verwendet wird, sollte es in einer konstanten

1

Ich stimme mit @Glenn für eine rein pingelige Sicht. Die Antwort ist, was für dich funktioniert. All dieser Code findet in 10 Zeilen statt (wenn Sie die ausgelassene letzte geschweifte Klammer einfügen). Niemand wird sich verirren und die Wahrscheinlichkeit, zu nisten, ist ziemlich gering (nicht unmöglich, aber sehr gering). Auf der anderen Seite, wenn Sie den Schlüssel woanders benutzt haben, dann gehen Sie DEFINIERLICH mit der Konstante.

Persönlich würde ich auf Sie über Ihre geschweiften Klammer Stil gehen. :) Ich mache nur Spaß! Es ist wirklich eine Frage des Stils.

0

Dies beantwortet nicht Ihre Frage, aber ich glaube nicht, dass "DefaultValue" bedeutet, was Sie denken, dass es bedeutet. Es legt keinen Standardwert für Ihre Eigenschaft fest.

Weitere Informationen finden Sie unter MSDN und this question.

0

Viele Leute würden wahrscheinlich argumentieren, dass die zweite Option "korrekt" ist, da jeder Wert, der mehr als einmal verwendet wird, in eine Konstante umgewandelt werden sollte. Ich würde höchstwahrscheinlich die erste Option verwenden. Sie sind der Lösung "Code Complete" bereits nahe gekommen, indem Sie den Wörterbucheintrag in eine stark typisierte Eigenschaft kapseln. Dies verringert die Wahrscheinlichkeit, dass der falsche Wörterbucheintrag in Ihrer Implementierung abgerufen wird. Es gibt nur 2 Stellen, an denen Sie "myKey" eingeben könnten, im Getter und Setter, und das wäre sehr leicht zu erkennen.

Die zweite Option würde einfach zu unordentlich werden.

0

Sie können die Eigenschaftsnamen mit den Schlüsseln abgleichen und Reflection verwenden, um den Namen für die Suche zu erhalten.

public string FirstProperty { 
get { 
    return Dictionary[PropertyName()]; 
} 
set { 
    Dictionary[PropertyName()] = value; 
} 

private string PropertyName() 
{ 
    return new StackFrame(1).GetMethod().Name.Substring(4); 
} 

Dies hat den zusätzlichen Vorteil, alle Ihre Immobilie Implementierung identisch zu machen, so dass Sie sie nach oben in Visual Studio als Code-Schnipsel setzen können, wenn Sie wollen.

0

Wenn Sie nur einen magischen String in einem Kontext verwenden, wie Sie, denke ich, dass es in Ordnung ist.Wenn Sie den Schlüssel in einem anderen Teil der Klasse verwenden müssen, gehen Sie const.

0

@Joel Sie wollen nicht auf StackFrame zählen. In-lining kann Ihren Tag ruinieren, wenn Sie es am wenigsten erwarten.

Aber auf die Frage: So oder so ist nicht wirklich eine ganze Menge.