我不明白以下类声明:
public abstract class Class1 <TDomainServiceContract, TDomainService>
{
...
}
我知道TDomainServiceContract
and TDomainService
是什么,但为什么在<
and>
符号之间使用它们?
我不明白以下类声明:
public abstract class Class1 <TDomainServiceContract, TDomainService>
{
...
}
我知道TDomainServiceContract
and TDomainService
是什么,但为什么在<
and>
符号之间使用它们?
<
和之间的参数>
是泛型类型参数。泛型,在一个非常高的层次上,允许你设计一个类,它不知道它的一个或多个参数、属性或方法的特定类型。用文字解释有点困难,但泛型最常见的用途是在集合中。
在泛型之前,大多数开发人员使用诸如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)不需要强制转换,因为索引器分别返回string
and 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
等的机制是相同的,但是泛型使得来自类的使用者的这种类型信息不会丢失在您的抽象中。
这表明在使用该类时,您可以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.
在此示例中,您只是确定将与该类一起使用的数据类型。你的例子中的类似情况。