it-swarm-ja.tech

ジェネリックス-オープンおよびクローズド構築型

最近、一般的な構築型を開いたり閉じたりできることに気づきました。しかし、私はそれらが実際に何を意味するのか理解していません。簡単な例を挙げていただけますか?

49
user196546

実際には、用語はそれほど重要ではありません-それについて書き込もうとしたときにexceptを最後に心配しなければならなかったときのことを思い出せません。

  • unbound型に型引数が指定されていません
  • constructed型には、少なくとも1つの型引数が指定されています
  • タイプパラメータはオープンタイプです
  • 要素型が開いている配列型はopen型
  • open構築型には、オープン型である型引数が少なくとも1つあります。
  • closedタイプは、開いていないタイプです。

(ネストされた型にはさらにルールがあります。詳細については、C#3.0仕様のセクション4.4を参照してください。)

オープン構築タイプの例として、次のことを考慮してください。

_public class NameDictionary<T> : Dictionary<string, T>
_

typeof(NameDictionary<>)の基本クラスは次のとおりです。

  • 型引数を指定するために構築されます
  • 2番目の型引数(T)はオープン型であるため、オープン

_Type.IsGenericType_ のMSDNドキュメントには、非常に便利な小さなテーブルがあります。

繰り返しになりますが、これは日常の使用ではほとんどまったく重要ではありません。

私は一般的に正しい用語を知っていることに賛成です-特に「参照渡し」などの場合-しかし、この場合、それは実際にはあまり頻繁に出てきません。私はあなたがそれについて心配することを積極的に思いとどまらせたいです:)

69
Jon Skeet

から [〜#〜] msdn [〜#〜]

ジェネリック型またはメソッドは、インスタンス化可能な型が、それを囲むすべての型のすべての型パラメーターを含む、そのすべての型パラメーターに置き換えられた場合に閉じられます。ジェネリック型のインスタンスは、閉じている場合にのみ作成できます。

したがって、これはList<int>closedとして機能します。

var list = Activator.CreateInstance(typeof(List<int>));

ただし、List<>openであるため、実行時に例外がスローされます。

var list = Activator.CreateInstance(typeof(List<>));
                                               ↑
7
dtb

私は主に、依存性注入マッピングでオープンジェネリック(基本的にインスタンス化されていないジェネリック)を使用しました。たとえば、

Bind<IRepository<>>()
   .To<BasicRepository<>>()

次に、オブジェクトコンストラクターに次のものが含まれている場合:

public SomethingController(IRepository<Something>) { ... }

私の依存性注入メカニズムは、BasicRepository <Something>を自動的にインスタンス化します。 (これはNinjectとStructureMap、そしておそらくCastle Windsorライブラリで機能します。他のフレームワークについてはよくわかりません)。

3
JasonTrue