次のクラス宣言がわかりません:
public abstract class Class1 <TDomainServiceContract, TDomainService>
{
...
}
TDomainServiceContract
と が何であるかは知っていTDomainService
ますが、なぜ<
と>
記号の間に使用されるのですか?
次のクラス宣言がわかりません:
public abstract class Class1 <TDomainServiceContract, TDomainService>
{
...
}
TDomainServiceContract
と が何であるかは知っていTDomainService
ますが、なぜ<
と>
記号の間に使用されるのですか?
<
との間のパラメーターは、>
ジェネリック型パラメーターです。ジェネリクスは、非常に高いレベルで、1 つまたは複数のパラメーター、プロパティ、またはメソッドの特定の型に依存しないクラスを設計できます。言葉で説明するのは少し難しいですが、ジェネリックの最も一般的な用途はコレクションです。
ジェネリックが登場する前は、ほとんどの開発者ArrayList
は、オブジェクトのコレクションを追跡するようなものを使用していました。これの欠点は安全性でした。object
に任意のものを入れることができるため、オブジェクトを期待される型にキャストし直す必要があり (コードがクリーンでなくなります)、そのオブジェクトの型ではないArrayList
ものを追加することを妨げるものは何もありませんでした (つまり、オブジェクトのみを含むと予想される がありますが、誤ってまたはなどを挿入する可能性があります)、キャストが失敗したときは実行時までわかりません。ArrayList
string
int
DbConnection
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
以外は何もできないことがわかっているため、コンパイル時に安全です。それらのリストに入れられます。string
int
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
などを格納する方法の仕組みは同じですが、ジェネリクスは、クラスのコンシューマーからのこの型情報が抽象化で失われないようにします。
これらはジェネリック型パラメーターです。
それらは、クラスがジェネリック クラスであることを意味します。例では、型に制約があります。どちらも、DomainContext
またはそれから派生したクラスである必要があります。
詳細については、MSDN のジェネリックの紹介 (C# プログラミング ガイド)を参照してください。
クラスを使用する場合、TDomainServiceContract
実装する に任意の型を提供できることを示していますDomainContext
。したがって、次のようなクラスを想定しましょう。
public class MyDomainContext : DomainContext
{
...
}
Class1
このような新しいものを作成するときに、そのクラスを使用できます。
var o = new Class1<MyDomainContext, MyDomainService>();
を実装しているからDomainContext
です。についても同様TDomainService
です。
それを見る別の方法は、より単純な例です。例えば:
List<String> myStrings = new List<String>();
myStrings.Add("One");
//Etc.
この例では、クラスで使用するデータ型を特定しているだけです。あなたの例でも同様の状況です。