2012-03-25 18 views
43

私はC#を初めて使用しています。<T>はC#で何を表しています

class SampleCollection<T> 

と私は

<T> 

の意味もそれはいわゆる何の意味を理解することはできません。しかし、私はこのようなコードを見てください。

誰かがこの概念が呼ばれている名前を付けるのを手伝ってくれたら、私はオンラインで検索できます。しかし、私は今のところ無知です。

+0

1upedoverflow.com/questions/361336/what-are-generic-collections-in-c#361365およびhttp://stackoverflow.com/questions/400314/what-does-t-mean -in-c。 – Abel

+0

[documentation](http://msdn.microsoft.com/en-us/library/512aeb7t.aspx)またはチュートリアルを要求しているので、他の多くのものと重複していますが、他のものと同様にトピック外です。 –

答えて

71

Generic Type Parameterです。

ジェネリック型パラメータを使用すると、メソッドまたはクラス宣言に具体的な型を指定せずに、コンパイル時にメソッドに任意の型Tを指定できます。例えば

public T[] Reverse<T>(T[] array) 
{ 
    var result = new T[array.Length]; 
    int j=0; 
    for(int i=array.Length; i>= 0; i--) 
    { 
     result[j] = array[i]; 
     j++; 
    } 
    return result; 
} 

は、配列の要素を反転させます。ここで重要なのは、配列要素はどんな型でも構いませんが、関数は引き続き機能することです。メソッド呼び出しで型を指定します。型安全性は依然として保証されています。だから、

、文字列の配列を逆にする:

string[] array = new string[] { "1", "2", "3", "4", "5" }; 
var result = reverse(array); 

これは、あなたが(非ジェネリック)通常と呼ばれていたかのように同じ効果があり{ "5", "4", "3", "2", "1" }

resultに文字列配列を演出しますこのようになります方法:

public string[] Reverse(string[] array) 
{ 
    var result = new string[array.Length]; 
    int j=0; 
    for(int i=array.Length; i >= 0; i--) 
    { 
     result[j] = array[i]; 
     j++; 
    } 
    return result; 
} 

コンパイラはarrayが文字列が含まれていることを見て、それがSTRIの配列を返します。 ngs。型パラメータは、T型パラメータと置き換えられます。


ジェネリック型パラメータを使用してジェネリッククラスを作成することもできます。与えた例ではSampleCollection<T>Tは任意の型のプレースホルダです。 SampleCollectionは、コレクションの作成時に指定するオブジェクトのコレクションを表すことができます。だから、

var collection = new SampleCollection<string>(); 

は、文字列を保持することができ、コレクションを作成します。上に例示したReverseの方法は、若干異なる形式で、コレクションのメンバーを逆にするために使用できます。

+0

実行時にジェネリック型パラメータTをどのように指定できますか? –

+0

@mikez:http://stackoverflow.com/questions/513952/c-sharp-specifying-generic-collection-type-param-at-runtime –

+2

はい、リフレクションを使用して、実行時に型パラメータを使用して汎用クラスをインスタンス化できます実行時にジェネリックを使用してタイプを指定し、通常の使用ではコンパイル時に型を指定すると言うのは紛らわしいものです。 – SoftMemes

6

この機能はジェネリックスとして知られています。 http://msdn.microsoft.com/en-us/library/512aeb7t(v=vs.100).aspx

この例は、特定のタイプのアイテムのコレクションを作成することです。

この場合
MyArray<int> = new MyArray<int>(); 

T[] arrayint[] arrayのように働くだろう、とpublic T GetItempublic int GetItemのように動作します:あなたのコードで

class MyArray<T> 
{ 
    T[] array = new T[10]; 

    public T GetItem(int index) 
    { 
     return array[index]; 
    } 
} 

は、あなたは、このような何かを行うことができます。

11

これは汎用タイプのパラメータsee Generics documentationです。

Tは予約語ではありません。 T,または任意の名称は、タイプパラメータを意味します。以下の方法を確認してください(簡単な例のように)。

T GetDefault<T>() 
{ 
    return default(T); 
} 

戻り値の型はTです。

GetDefault<int>(); // 0 
GetDefault<string>(); // null 
GetDefault<DateTime>(); // 01/01/0001 00:00:00 
GetDefault<TimeSpan>(); // 00:00:00 

.NETはコレクションにジェネリックを使用して、...例:この方法を使えば、メソッドを呼び出すことにより、任意のタイプのデフォルト値を取得することができます

List<int> integerList = new List<int>(); 

あなたが持つことになります。この道を

public class List<T> : ... 
{ 
    public void Add(T item); 
} 
:クラスが、この場合 intには、タイプ Tでinstancitedされており、要素を追加する方法は次のように書かれているためだけで、整数を受け付けリスト

ジェネリックについてもう少し詳しい情報。

タイプTの範囲を制限することができます。

次の例だけあなたがクラスであるタイプでメソッドを呼び出すことができます。

void Foo<T>(T item) where T: class 
{ 
} 

次の例だけではCircleまたはそれを継承しているタイプでメソッドを呼び出すことができます。

void Foo<T>(T item) where T: Circle 
{ 
} 

そして、それはパラメータなしのコンストラクタを持っている場合は、Tのインスタンスを作成することができると言うnew()があります。 TCircleとして扱われます次の例では、あなたがTとして

void Foo<T>(T item) where T: Circle, new() 
{ 
    T newCircle = new T(); 
} 

は型パラメータです...インテリセンスを取得、あなたはそれからオブジェクトTypeを得ることができます。より複雑な例としてTypeあなたはリフレクションを使用することができます...

void Foo<T>(T item) where T: class 
{ 
    Type type = typeof(T); 
} 

で、ToDictionaryの署名または任意の他のLINQの方法を確認してください。

public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector); 

TしかしTKeyTSourceがあり、そこではありません。上記のように接頭辞Tを使用して、常に型パラメータの名前を付けることをお勧めします。

場合によってはTSomethingFooという名前を付けることもできます。

関連する問題