C#泛型:引用类型与值

时间:2009-03-01 21:09:40

标签: c# generics

在API编码过程中,我遇到了很多关于通用引用类型与泛型值类型差异的混淆。

伙计们,问题是这两种野兽之间在约束和功能(最重要/容易被忽视的)方面有什么不同:

class ReferenceGeneric <T> where ???
{

}

struct ValueGeneric <T>: where ???
{


}

编辑只是为了澄清问题以及我所追求的内容:我想知道您可以使用通用引用类型做什么而不能使用通用值类型...反之亦然

编辑#2 进一步说明:如果泛型类型是引用类型或值类型,那么如何约束T?是否存在关于如何约束每种类型的差异?

2 个答案:

答案 0 :(得分:14)

请注意,声明为结构的任何内容始终是值类型,声明为类的任何内容始终是引用类型。换句话说,List<int>仍然是引用类型,如果您有:

struct Foo<T>
{
    T value;
}

然后Foo<string>仍然是值类型。

至于你可以用通用类型做什么 - 它们实际上只是遵循值类型和引用类型的常规规则;至于你在类型中使用T 类型的值可以做什么,这取决于T是否受约束。它不会因为泛型类型本身是结构还是类而有所不同。

编辑:Sasha在评论中提及Nullable<T>。我不确定这里的“例外”是什么意思 - 除了Nullable<T>不满足“where T : struct”或“where T : class”约束。它仍然是一种价值类型(这是重点的一部分)。

答案 1 :(得分:9)

响应Edit2:您可以通过以下方式限制允许引用或值的类型:

参考:

class ReferenceGeneric <T> where T: class
{

}

值:

struct ValueGeneric <T> where T: struct 
{


}

从MSDN上的以下页面 http://msdn.microsoft.com/en-us/library/d5x73970.aspx