web-dev-qa-db-ja.com

C#では、メソッド宣言後の<T>とは何ですか?

私はVB.Netの人です。 (私の小切手に署名した人がそう言っているので、私はそうしなければならないので。:P)私はJavaで育ちました、そして私は一般的にC#で読み書きするのに苦労しません今日、私は見たことのない構文があり、理解できないようです。

次のメソッド宣言では、<T>は何を表していますか?

static void Foo <T>(params T [] x)

ジェネリックコレクションやジェネリックコレクションの宣言と組み合わせて使用​​するのを見てきましたが、このメソッドでそれが何をするかを理解することはできません。

それが重要である場合、私はいくつかのことを考えているときにそれに遭遇しました C#の頭の体操 。 6番目のティーザーには、コード全体が含まれています。

27
Drew

これは、C#2.0でC#に追加された generics の1つの形式である generic method を定義します。

メソッドsigは次のようになります。

static void Foo<T>(params T[] x)
{ // ...

これにより、任意の(特定の)型の任意の数の引数をメソッドFooに渡すことができ、その引数の配列に作用します。スコープがメソッドに限定されていることを除いて、ジェネリック型のしくみに似ています。 <T>は、メソッドに渡される引数のタイプを指定するため、次のように呼び出すことができます。

Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance);
23
Reed Copsey

あなたが求めているのは、c#のジェネリックの概念です。ジェネリックを使用することで、このメソッドを必要なタイプに使用できます

2つの数値を加算する関数を作成する必要があるとします。その場合、関数は

//For integer :
public int sum(int a, int b)
{ 
  return a + b;
}



//For floating point numbers :
public float sum( float a, float b)
{
  return a + b;
}

このロジックに従って、2つのdouble型の数値を合計する関数が必要な場合は、もう1つの関数を作成します。

注:上記のコードはC#では機能しませんが、概念を簡単に説明するために、null許容型または参照型を簡単に作成するか、値をプライマリ型に変換するロジックを作成する必要があります。

ジェネリックの助けを借りて、これらの関数をすべて置き換えて、次のように書くことができます。

public T sum<T>(T a, T b)
{
  return a + b;
}

これは、文字列だけでなく、すべての数値型で機能します。

詳細はこちらをご覧ください: http://www.codeproject.com/kb/books/EssentialCS20.aspx

28
Pranay Rana

これは、ジェネリックメソッドのジェネリックタイプパラメーターです。

メソッドを呼び出すときにTの型を指定すると、.NETはその型パラメーターに基づいて型の安全性を確保できます。

static void Foo<T>(params T[] x) { }

次のように呼び出されます:

string[] names = new string[] {"Foo", "Bar", "Baz"};

Foo<string>(names);

しかし、これはコンパイラエラーを引き起こします。

int[] nums = new int[] {1, 2, 3};

Foo<string>(nums); // nums is not string[]
1
Justin Niessner

Tは typeパラメーター であり、この場合は何でもかまいません(制約を指定できますが、ここでは制約はありません)。この機能がなければ、使用する予定のすべての型のメソッドを宣言する必要があります。

static void Foo(params int[] x)    
static void Foo(params string[] x)    
static void Foo(params Customer[] x)    
etc...

ジェネリックの詳細については、MSDN: Introduction to Generics(C#) を参照してください。

1
Mark Byers