11

このようなクラスがある場合: -

static class Foo {
   public static void Bar<T>(T item) { Console.WriteLine(item.ToString(); }
}

この例では、すべてのタイプに ToString() があるなどの理由で T を使用する必要がないことはわかっています。これは単なる不自然な例です。私がもっと興味を持っているのは、次の観点からボンネットの下で何が起こるかです: -

Foo.Bar("Hello");
Foo.Bar(123);
Foo.Bar(new Employee("Isaac"));

私は広く(考えてください!)具体化を理解しています。つまり、さまざまなタイプのジェネリッククラスを作成する場合などです。

List<Int32>
List<String>
List<Employee>

など。その後、コンパイル時 (または実行時?) に、指定されたジェネリック引数ごとに 1 つずつ、3 つの実際の具象型になります。最初の例のメソッド呼び出しにも同じことが当てはまりますか。つまり、単一のクラス Foo があり、具体化された 3 つの Bar メソッド (1 つは String、Int32、および Employee) でしょうか?

4

1 に答える 1

3

ここで、C++ テンプレートと C# ジェネリックの違いが出てきます。

C++ では、テンプレートにより、使用される型ごとに新しいメソッドが生成されます。ただし、C# では、メソッド内のコードは 1 回しか作成されません。intstring、またはobject型パラメーターを指定して呼び出しても、同じコードが実行されます。

C# ジェネリックはコンパイル時にジェネリックのままであるため、再コンパイルする必要なく、コンパイル済みライブラリで公開できます。C++ では、使用するコードに元のテンプレートを含める必要があるため、新しいコピーをコンパイルできます。

簡単に言えば、ジェネリック メソッドごとに 1 つのコンパイル済みメソッドしか取得できません。

于 2012-12-11T16:54:43.950 に答える