16

我不明白以下类声明:

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

我知道TDomainServiceContract and TDomainService是什么,但为什么在<and>符号之间使用它们?

4

4 回答 4

30

<和之间的参数>是泛型类型参数。泛型,在一个非常高的层次上,允许你设计一个类,它不知道它的一个或多个参数、属性或方法的特定类型。用文字解释有点困难,但泛型最常见的用途是在集合中。

在泛型之前,大多数开发人员使用诸如ArrayList跟踪对象集合之类的东西。这样做的缺点是安全。因为您可以将 anyobject放入 a 中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)不需要强制转换,因为索引器分别返回stringand int,并且 b)在编译时是安全的,因为我知道除了 astring或 an 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等的机制是相同的,但是泛型使得来自类的使用者的这种类型信息不会丢失在您的抽象中。

于 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 回答