new
ほとんどの場合は回避できる一方で、キーワードを非表示に使用できるというトリッキーな状況が常に見つかります。
ただし、最近、このキーワードが本当に必要でした。主な理由は、主に言語に既存のアクセサーを完成させるための他の適切なシンタックス機能が欠けているためです。
次のような昔ながらのクラスを考えてみます。
KeyedCollection<TKey, TItem>
項目のトラフ インデックスにアクセスするためのアクセサーは次のとおりです。
TItem this[Int32 index] { get; set; }
両方あり{ get; set; }
、 と に関する継承のためにもちろん必須ですが、キーを介してアイテムにアクセスするためのものは 1 つだけです (この設計についていくつかの推測があり、それには多くの理由があるので、私が選んだことに注意してください)。説明のためだけに上に上げます)。ICollection<T>
Collection<T>
{ get; }
KeyedCollection<TKey, TItem>)
とにかく、キーアクセス用のゲッターは1つだけです:
TItem this[TKey key] { get; }
しかし、サポートを追加したい場合はどうでしょうか{ set; }
。技術的に言えば、特にプロパティの以前の定義から推論し続ける場合は、それほど愚かではありません。それは単なるメソッドです...唯一の方法は、別のダミーインターフェイスを明示的に実装することですが、暗黙的にしたい場合は、キーワードを考え出す必要がありnew
ます。アクセサ定義を隠して、get; を保持しています。基本的な定義を作成し、いくつかの個人的なものを詰め込んだセットを追加して、それを機能させます。
この非常に具体的なシナリオでは、このキーワードは完全に適用可能であると思います{ get; }
。
public new TItem this[TKey key]
{
get { return base... }
set { ... }
}
これが、この種の警告を回避するためのほぼ唯一のトリックです。これは、コンパイラが、自分が何をしているのか気付かずに隠れている可能性があることを示唆しているためです。