へのアクセス同じインデクサー構文を使用して辞書要素にアクセスする一般的な方法です。理由は、インスタンスがディクショナリにない場合は、単にエラーを投げるのではなく、何らかのアクションを取ることです。たちは国民の辞書を持つクラスを持っているプライベート辞書
どうすればよいですか?
へのアクセス同じインデクサー構文を使用して辞書要素にアクセスする一般的な方法です。理由は、インスタンスがディクショナリにない場合は、単にエラーを投げるのではなく、何らかのアクションを取ることです。たちは国民の辞書を持つクラスを持っているプライベート辞書
どうすればよいですか?
正確にはと同じ構文ですか?あなたはとしてそれをアクセスする気にしない場合:
Instance inst = a["key"];
それは簡単です - あなただけのインデクサーを追加します。
public class SomethingWithADictionary {
private Dictionary<string, Instance> instances =
new Dictionary<string, Instance>();
public Instance this[string key]
{
get
{
Instance instance;
if (!instances.TryGetValue(key, out instance))
{
// Custom logic here
}
return instance;
}
// You may not even want this...
set { instances[key] = value; }
}
}
Indexed propertyが移動するための方法です。 これはそれを行う必要があります:
public class SomethingWithADictionary {
private Dictionary<string, Instance> Instances { get; set; }
[System.Runtime.CompilerServices.IndexerNameAttribute("Instances")]
public Instance this [String skillId]{
// Add getters and setters to manipulate Instances dictionary
}
}
C#はIndexerNameAttributeを使用しないため、C#で 'a.Instances [" foo "]'としてアクセスすることはできません。また、フィールドを公開したままにしておけば、現時点ではコンパイルされません。インスタンスには2つのメンバー名があります。 –
@JonSkeetありがとう、ちょうど私のコードを編集しました。誰が 'IndexerNameAttribute'を使っていますか?コンパイラがまだ使用していないにもかかわらず、なぜそれがまだ利用可能であるかのアイデア? – GETah
その構文はよかったです。私は発信者を変更することができます。 –
TryGetValueは遅くなっていますか?私たちはこれを多くしています。 getterの内部では、通常の方法で例外をキャッチするほうがよいでしょうか?例外を処理するオーバーヘッドは問題ではありません。これらは非常にまれです。 –
@OldMan:なぜそれが遅くなると思いますか?例外的なケースでは例外をキャッチするよりも速くなるはずですが、ContainsKeyで確認してからインデクサーを使用するよりも速くなります。私はパフォーマンスがインデクサとほぼ同じであると期待しています。実際、TryGetValueを使用してインデクサを実装しても驚くことはありません。もちろん、パフォーマンスに関する懸念がある場合は、適切な方法は*テスト*することです。 –