コレクションの作成にジェネリックが役立つことを MSDN で読みました。私は C# にかなり慣れていないので、コレクション以外の目的でジェネリックを使用する場合があるかどうか疑問に思っています。もしあれば、あなたの主張を説明するための例を提供できますか.
3 に答える
.NET ライブラリの一部を次に示します。
IComparer<T>
T
- 2 つのを比較するために使用されるインターフェース
IEquatable<T>
T
- 2 つの が等しいかどうかを判断するために使用されるインターフェース
Nullable<T>
- null 非許容型に null 値を提供するために使用されます (例: int
)
Tuple<T1, T2>
- 厳密に型指定された 2 つの値を保持するクイック コンテナとして使用
Action<T>
- を返すデリゲートを保持するために使用されますT
ジェネリクスは、コードの再利用と型の安全性を促進することを主な目的とする機能であり、コレクションだけでなく、コードのより広いセグメントに適用できる概念です。
コードの再利用とタイプ セーフがコレクションと密接に関連していることは簡単にわかります。LINQ はジェネリックを使用して、任意の型の列挙可能なシーケンス (コードの再利用) を操作できるアルゴリズムを提供し、さまざまなジェネリック コレクション クラスもジェネリック型を使用します。型安全性を提供するための情報 (たとえば、 を に追加しようとするプログラムint
はList<string>
コンパイルさえしません)。
とはいえ、ジェネリックを活用する機会は他にもたくさんあります。たとえば、ファクトリは型の安全性のためにジェネリックを使用できます。
class Factory
{
// can create any type of Widget, will not allow e.g. Create<string>()
public Widget Create<T>() where T: Widget { ... }
}
ジェネリックの使用の短いリスト (私自身の Windows アプリケーション フレームワークから):
- データ アクセス (Entity Framework と
Repository<T>
パターンを使用) - 分離アーキテクチャ (MEF を使用
GetExport<T>
) - キャッシング (MemoryCache を使用) - これもほとんどがコレクションに関連しています。
- 一般的な基本的な CRUD コントラクト (
IService<T>
基本的な CRUD メソッドを提供するインターフェイス経由) - グラフ (エンティティ ツリー) の反復と操作。
- 厳密に型指定された INotifyPropertyChanged
- データベースから ViewModel までの汎用レイヤー。
DelegateCommand<T>
- EventAggregator / メッセンジャー
- リストの式ベースの検索基準
- DataTemplateManager
そしてリストは永遠に続きます...
結論:
ジェネリックスは、C# の最も優れた、より一般的な機能の 1 つです。