14 c# generics class declaration
我不明白以下的类声明:
public abstract class Class1 <TDomainServiceContract, TDomainService>
{
...
}
Run Code Online (Sandbox Code Playgroud)
我知道TDomainServiceContract
和 TDomainService
是的,但为什么他们之间使用<
和>
符号?
Ada*_*son 29
<
和之间的参数>
是泛型类型参数.泛型,在很高的层次上,允许您设计一个与其一个或多个参数,属性或方法的特定类型无关的类.用文字解释有点困难,但泛型的最常见用法是收藏.
在泛型之前,大多数开发人员使用诸如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
Run Code Online (Sandbox Code Playgroud)
引入泛型后,我们上了List<T>
课.这是一个采用单个泛型类型参数的类 - 即您期望列表包含的对象类型.这样一来,我可以有一个List<string>
或一个List<int>
将一)不需要铸造,因为索引返回string
和int
分别,和b)是在编译时安全的,因为我知道,没有什么其他的不是一个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
Run Code Online (Sandbox Code Playgroud)
泛型的意思是说你不关心你正在使用的对象的实际类型是什么,但是你的类的消费者可能会这样做.换句话说,列表如何存储a string
,a int
,a DbConnection
等的机制是必不可少的,但是泛型使得来自类的消费者的这种类型信息不会在你的抽象中丢失.