プロパティを使用して辞書内のキーと値のペアを参照する最良の方法 [終了]

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

質問

これはかなり些細な問題ですが、これについて人々の意見を聞きたいです。

プロパティを通じてアクセスする辞書がある場合、プロパティには次のどの形式を使用しますか?

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

おそらくこれが典型的なやり方だと思われます。かなり効率的で、理解しやすいなどです。唯一の欠点は、キーが長く、より複雑な場合、スペルを間違えたり、1 つのインスタンスのみを変更したりする可能性があり、次のような結果になることです。

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

これはわずかに複雑ですが、さらなる安全性を提供するようで、私が考える「コード完全な」ソリューションに近いものです。欠点は、プロパティの上に /// ブロックと [DefaultValue()] ブロックもすでにある場合、そこが少し混雑し始めることです。

それで、どちらが好きですか、そしてその理由は何ですか?誰かもっと良いアイデアはありますか?

役に立ちましたか?

解決

私が 2 番目の方法が気に入っているのは、コード内でマジック文字列や数字を避けるのが良いことだからです。コード内で数値または文字列リテラルを複数回参照する必要がある場合は、定数にする必要があります。ほとんどの場合、たとえ一度しか使用されなかったとしても、定数に含める必要があります。

他のヒント

私は純粋に細かい点にこだわる観点については @Glenn に同意します。答えは、あなたにとって役立つものなら何でもです。このコードはすべて 10 行で行われます (省略された最後の中括弧を含める場合)。誰も道に迷うことはなく、タイプミスの可能性もかなり低いです (不可能ではありませんが、非常に低いです)。一方、他の場所でキーを使用した場合は、間違いなく定数を使用してください。

個人的には、あなたの中括弧のスタイルについて非難したいと思います。:) 冗談です!それは本当にスタイルの問題です。

これはあなたの質問の答えではありませんが、「DefaultValue」はあなたが考えているような意味ではないと思います。プロパティのデフォルト値は設定されません。

見る MSDN そして この質問 詳細については。

複数回使用される値は定数にリファクタリングする必要があるため、多くの人はおそらく 2 番目のオプションが「正しい」と主張するでしょう。おそらく最初のオプションを使用するでしょう。辞書エントリを強力な型指定されたプロパティにカプセル化することで、すでに「コード完了」ソリューションに近づいています。これにより、実装内で間違った辞書エントリを取得して失敗する可能性が減ります。「myKey」の入力を間違える可能性がある場所はゲッターとセッターの 2 か所だけで、これは非常に簡単に見つけることができます。

2 番目のオプションは非常に面倒になります。

あなたのように、マジック ストリングを 1 つのコンテキストでのみ使用する場合は、問題ないと思います。
ただし、クラスの別の部分でキーを使用する必要がある場合は、 const.

プロパティ名をキーと照合し、リフレクションを使用してルックアップの名前を取得できます。

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

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

これには、すべてのプロパティの実装が同一になるという追加の利点があるため、必要に応じて Visual Studio でコード スニペットとして設定できます。

@Joel、StackFrameに頼りたくないです。 インライニング 予期せぬときに一日を台無しにしてしまう可能性があります。

しかし、質問には次のようになります。どちらの方法でも、実際にはあまり重要ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top