在C#中使用"小于"和"大于"符号之间的类名是什么意思?

14 c# generics class declaration

我不明白以下的类声明:

public abstract class Class1 <TDomainServiceContract, TDomainService>
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

我知道TDomainServiceContractTDomainService是的,但为什么他们之间使用<>符号?

Ada*_*son 29

<和之间的参数>是泛型类型参数.泛型,在很高的层次上,允许您设计一个与其一个或多个参数,属性或方法的特定类型无关的类.用文字解释有点困难,但泛型的最常见用法是收藏.

在泛型之前,大多数开发人员使用诸如ArrayList跟踪对象集合之类的东西.这方面的缺点是安全; 因为你可以把任何objectArrayList,这意味着,你必须投你的对象返回给期望的类型(使代码不干净的),你什么都没有从添加的东西,阻止你是不是那个类型的对象(即我可以有一个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
Run Code Online (Sandbox Code Playgroud)

引入泛型后,我们上了List<T>课.这是一个采用单个泛型类型参数的类 - 即您期望列表包含的对象类型.这样一来,我可以有一个List<string>或一个List<int>将一)不需要铸造,因为索引返回stringint分别,和b)是在编译时安全的,因为我知道,没有什么其他的不是一个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
Run Code Online (Sandbox Code Playgroud)

泛型的意思是说你不关心你正在使用的对象的实际类型是什么,但是你的类的消费者可能会这样做.换句话说,列表如何存储a string,a int,a DbConnection等的机制是必不可少的,但是泛型使得来自类的消费者的这种类型信息不会在你的抽象中丢失.

  • +1我刚刚开始学习C#,这正是我所需要的.干杯! (2认同)

Ode*_*ded 6

这些是通用类型参数.

它们意味着类是泛型类,在您的示例中具有对类型的约束 - 两者都需要DomainContext或者从它派生的类.

有关详细信息,请参阅MSDN上的泛型简介(C#编程指南).