我不明白以下的类声明:
public abstract class Class1 <TDomainServiceContract, TDomainService>
{
...
}
我知道TDomainServiceContract
和TDomainService
是什么,但为什么在<
和>
符号之间使用它们?
答案 0 :(得分:29)
<
和>
之间的参数是泛型类型参数。泛型,在非常高的层次上,允许您设计一个与其一个或多个参数,属性或方法的特定类型无关的类。用文字解释有点困难,但泛型的最常见用途是收藏。
在泛型之前,大多数开发人员使用诸如ArrayList
之类的东西来跟踪对象的集合。这方面的缺点是安全;因为你可以在object
中放置任何ArrayList
,这意味着你必须将你的对象强制转换回预期的类型(使代码不那么干净),你没有什么能阻止你添加< em>不是那种类型的对象(即我可能有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>
类。这是一个采用单个泛型类型参数的类 - 即您期望列表包含的对象类型。这样,我可以有一个List<string>
或List<int>
a)不需要强制转换,因为索引器分别返回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
泛型的意思是说你不关心你正在使用的对象的实际类型是什么,但是你的类的消费者可能会这样做。换句话说,列表如何存储string
,int
,DbConnection
等的机制是必不可少的,但是泛型使得此类型信息来自你的班级的消费者不会在你的抽象中迷失。
答案 1 :(得分:6)
它们意味着类是泛型类,在您的示例中对类型有约束 - 都需要DomainContext
或从中派生的类。
有关详细信息,请参阅MSDN上的Introduction to Generics (C# Programming Guide)。
答案 2 :(得分:1)
它表明在使用该类时,您可以为实现TDomainServiceContract
的{{1}}提供任何类型。所以让我们假设一个这样的类:
DomainContext
我可以在创建新的public class MyDomainContext : DomainContext
{
...
}
时使用该类:
Class1
因为它实现了var o = new Class1<MyDomainContext, MyDomainService>();
。 DomainContext
也是如此。
答案 3 :(得分:1)
另一种看待它的方法是一个更简单的例子。例如:
List<String> myStrings = new List<String>();
myStrings.Add("One");
//Etc.
在此示例中,您只是确定将与该类一起使用的数据类型。您的示例中的类似情况。