Beste Möglichkeit, eine Eigenschaft zu verwenden, um auf ein Schlüssel-Wert-Paar in einem Wörterbuch zu verweisen [geschlossen]

StackOverflow https://stackoverflow.com/questions/44100

Frage

Das ist eine ziemlich triviale Angelegenheit, aber ich bin gespannt auf die Meinungen der Leute dazu.

Wenn ich ein Wörterbuch habe, auf das ich über Eigenschaften zugreifen kann, welches 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 die typische Vorgehensweise.Es ist ziemlich effizient, leicht zu verstehen usw.Der einzige Nachteil besteht darin, dass es bei einem längeren oder komplexeren Schlüssel möglich wäre, ihn falsch zu schreiben oder nur eine Instanz oder so etwas zu ändern, was mich zu folgendem führt:

/// <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;
    }

Das ist etwas komplizierter, scheint aber zusätzliche Sicherheit zu bieten und näher an dem zu liegen, was ich als „Code Complete“-Lösung bezeichnen würde.Der Nachteil ist, dass es dort oben etwas eng wird, wenn Sie bereits einen ///-Block und einen [DefaultValue()]-Block über der Eigenschaft haben.

Was gefällt dir also besser und warum?Hat jemand bessere Ideen?

War es hilfreich?

Lösung

Ich mag die zweite Variante einfach deshalb, weil es eine gute Sache ist, magische Zeichenfolgen/Zahlen im Code zu vermeiden.Wenn Sie im Code mehr als einmal auf eine Zahl oder ein Zeichenfolgenliteral verweisen müssen, sollte es sich meiner Meinung nach um eine Konstante handeln.In den meisten Fällen sollte es sich in einer Konstante befinden, auch wenn es nur einmal verwendet wird

Andere Tipps

Ich stimme mit @Glenn überein, was eine rein wählerische Sichtweise betrifft.Die Antwort ist, was auch immer für Sie funktioniert.Der gesamte Code erfolgt in 10 Zeilen (wenn Sie die letzte geschweifte Klammer weglassen).Niemand geht verloren und die Wahrscheinlichkeit, sich zu vertippen, ist ziemlich gering (nicht unmöglich, aber sehr gering).Wenn Sie den Schlüssel hingegen woanders verwendet haben, verwenden Sie UNBEDINGT die Konstante.

Persönlich würde ich Sie wegen Ihres Stils mit der geschweiften Klammer angreifen.:) Nur ein Scherz!Es ist wirklich eine Frage des Stils.

Dies beantwortet Ihre Frage nicht, aber ich glaube nicht, dass „DefaultValue“ das bedeutet, was Sie denken.Es wird kein Standardwert für Ihre Eigenschaft festgelegt.

Sehen MSDN Und diese Frage für mehr Details.

Viele Leute würden wahrscheinlich argumentieren, dass die zweite Option „richtig“ ist, da jeder Wert, der mehr als einmal verwendet wird, in eine Konstante umgestaltet werden sollte.Ich würde höchstwahrscheinlich die erste Option verwenden.Sie sind der „Code Complete“-Lösung bereits nahe gekommen, indem Sie den Wörterbucheintrag in eine stark typisierte Eigenschaft gekapselt haben.Dies verringert die Wahrscheinlichkeit, dass das Abrufen des falschen Wörterbucheintrags in Ihrer Implementierung vermasselt wird.Es gibt nur zwei Stellen, an denen Sie bei der Eingabe von „myKey“ im Getter und Setter Fehler machen könnten, und das wäre sehr leicht zu erkennen.

Die zweite Option würde einfach zu chaotisch werden.

Wenn Sie eine magische Zeichenfolge nur in einem Kontext verwenden, wie Sie es tun, ist das meiner Meinung nach in Ordnung.
Aber wenn Sie den Schlüssel jemals in einem anderen Teil der Klasse verwenden müssen, gehen Sie const.

Sie könnten die Eigenschaftsnamen mit den Schlüsseln abgleichen und Reflektion 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, dass alle Ihre Eigenschaftenimplementierungen identisch sind, sodass Sie sie bei Bedarf in Visual Studio als Codeausschnitte einrichten können.

@Joel, du willst nicht auf StackFrame zählen. Innenfutter kann Ihren Tag ruinieren, wenn Sie es am wenigsten erwarten.

Aber zur Frage:So oder so spielt es keine große Rolle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top