2012-03-04 15 views

答えて

3

正確にはと同じ構文ですか?あなたはとしてそれをアクセスする気にしない場合:

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; } 
    } 
} 
+0

その構文はよかったです。私は発信者を変更することができます。 –

+0

TryGetValueは遅くなっていますか?私たちはこれを多くしています。 getterの内部では、通常の方法で例外をキャッチするほうがよいでしょうか?例外を処理するオーバーヘッドは問題ではありません。これらは非常にまれです。 –

+0

@OldMan:なぜそれが遅くなると思いますか?例外的なケースでは例外をキャッチするよりも速くなるはずですが、ContainsKeyで確認してからインデクサーを使用するよりも速くなります。私はパフォーマンスがインデクサとほぼ同じであると期待しています。実際、TryGetValueを使用してインデクサを実装しても驚くことはありません。もちろん、パフォーマンスに関する懸念がある場合は、適切な方法は*テスト*することです。 –

0

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 
    } 
} 
+0

C#はIndexerNameAttributeを使用しないため、C#で 'a.Instances [" foo "]'としてアクセスすることはできません。また、フィールドを公開したままにしておけば、現時点ではコンパイルされません。インスタンスには2つのメンバー名があります。 –

+0

@JonSkeetありがとう、ちょうど私のコードを編集しました。誰が 'IndexerNameAttribute'を使っていますか?コンパイラがまだ使用していないにもかかわらず、なぜそれがまだ利用可能であるかのアイデア? – GETah

関連する問題