私はC#を初めて使用しています。<T>はC#で何を表しています
class SampleCollection<T>
と私は
<T>
の意味もそれはいわゆる何の意味を理解することはできません。しかし、私はこのようなコードを見てください。
誰かがこの概念が呼ばれている名前を付けるのを手伝ってくれたら、私はオンラインで検索できます。しかし、私は今のところ無知です。
私はC#を初めて使用しています。<T>はC#で何を表しています
class SampleCollection<T>
と私は
<T>
の意味もそれはいわゆる何の意味を理解することはできません。しかし、私はこのようなコードを見てください。
誰かがこの概念が呼ばれている名前を付けるのを手伝ってくれたら、私はオンラインで検索できます。しかし、私は今のところ無知です。
ジェネリック型パラメータを使用すると、メソッドまたはクラス宣言に具体的な型を指定せずに、コンパイル時にメソッドに任意の型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
の方法は、若干異なる形式で、コレクションのメンバーを逆にするために使用できます。
実行時にジェネリック型パラメータTをどのように指定できますか? –
@mikez:http://stackoverflow.com/questions/513952/c-sharp-specifying-generic-collection-type-param-at-runtime –
はい、リフレクションを使用して、実行時に型パラメータを使用して汎用クラスをインスタンス化できます実行時にジェネリックを使用してタイプを指定し、通常の使用ではコンパイル時に型を指定すると言うのは紛らわしいものです。 – SoftMemes
この機能はジェネリックスとして知られています。 http://msdn.microsoft.com/en-us/library/512aeb7t(v=vs.100).aspx
この例は、特定のタイプのアイテムのコレクションを作成することです。
この場合MyArray<int> = new MyArray<int>();
、T[] array
はint[] array
のように働くだろう、とpublic T GetItem
はpublic int GetItem
のように動作します:あなたのコードで
class MyArray<T>
{
T[] array = new T[10];
public T GetItem(int index)
{
return array[index];
}
}
は、あなたは、このような何かを行うことができます。
これは汎用タイプのパラメータ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()
があります。 T
がCircle
として扱われます次の例では、あなたが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
しかしTKey
とTSource
があり、そこではありません。上記のように接頭辞T
を使用して、常に型パラメータの名前を付けることをお勧めします。
場合によってはTSomethingFoo
という名前を付けることもできます。
1upedoverflow.com/questions/361336/what-are-generic-collections-in-c#361365およびhttp://stackoverflow.com/questions/400314/what-does-t-mean -in-c。 – Abel
[documentation](http://msdn.microsoft.com/en-us/library/512aeb7t.aspx)またはチュートリアルを要求しているので、他の多くのものと重複していますが、他のものと同様にトピック外です。 –