16

次のクラス宣言がわかりません:

public abstract class Class1 <TDomainServiceContract, TDomainService>
{
   ...
}

TDomainServiceContract と が何であるかは知っていTDomainServiceますが、なぜ<>記号の間に使用されるのですか?

4

4 に答える 4

30

<との間のパラメーターは、>ジェネリック型パラメーターです。ジェネリクスは、非常に高いレベルで、1 つまたは複数のパラメーター、プロパティ、またはメソッドの特定の型に依存しないクラスを設計できます。言葉で説明するのは少し難しいですが、ジェネリックの最も一般的な用途はコレクションです。

ジェネリックが登場する前は、ほとんどの開発者ArrayListは、オブジェクトのコレクションを追跡するようなものを使用していました。これの欠点は安全性でした。objectに任意のものを入れることができるため、オブジェクトを期待される型にキャストし直す必要があり (コードがクリーンでなくなります)、そのオブジェクトの型ではないArrayListものを追加することを妨げるものは何もありませんでした (つまり、オブジェクトのみを含むと予想される がありますが、誤ってまたはなどを挿入する可能性があります)、キャストが失敗したときは実行時までわかりません。ArrayListstringintDbConnection

ArrayList myStrings = new ArrayList();

myStrings.Add("foo");
myStrings.Add("bar");
myStrings.Add(1); // uh-oh, this isn't going to turn out well...

string string1 = (string)myStrings[0];
string string2 = (string)myStrings[1];
string string3 = (string)myStrings[2]; // this will compile fine but fail at 
                                       // runtime since myStrings[2] is an int, 
                                       // not a string

ジェネリックが導入された後、List<T>クラスを取得しました。これは、単一のジェネリック型引数、つまり、リストに含まれると予想されるオブジェクトの型を取る単一のクラスです。そうすれば、aList<string>または aを使用できますList<int>。a) インデクサーがそれぞれstringおよびを返すため、キャストを必要とせず、b) aまたは(それぞれ)int以外は何もできないことがわかっているため、コンパイル時に安全です。それらのリストに入れられます。stringint

List<string> myStrings = new List<string>();

myStrings.Add("foo");
myStrings.Add("bar");
myStrings.Add(1); // this will not compile, as an int is not a string

ジェネリックの要点は、作業しているオブジェクトの実際の型は気にしないが、クラスの消費者は気にするかもしれないということです。言い換えれば、リストが a string、 an int、 aDbConnectionなどを格納する方法の仕組みは同じですが、ジェネリクスは、クラスのコンシューマーからのこの型情報が抽象化で失われないようにします。

于 2012-09-20T16:03:26.513 に答える
6

これらはジェネリック型パラメーターです。

それらは、クラスがジェネリック クラスであることを意味します。例では、型に制約があります。どちらも、DomainContextまたはそれから派生したクラスである必要があります。

詳細については、MSDN のジェネリックの紹介 (C# プログラミング ガイド)を参照してください。

于 2012-09-20T15:57:25.287 に答える
1

クラスを使用する場合、TDomainServiceContract実装する に任意の型を提供できることを示していますDomainContext。したがって、次のようなクラスを想定しましょう。

public class MyDomainContext : DomainContext
{
    ...
}

Class1このような新しいものを作成するときに、そのクラスを使用できます。

var o = new Class1<MyDomainContext, MyDomainService>();

を実装しているからDomainContextです。についても同様TDomainServiceです。

于 2012-09-20T15:58:02.207 に答える
1

それを見る別の方法は、より単純な例です。例えば:

List<String> myStrings = new List<String>();
myStrings.Add("One");
//Etc.

この例では、クラスで使用するデータ型を特定しているだけです。あなたの例でも同様の状況です。

于 2012-09-20T16:00:41.410 に答える