泛型类型实现中的值和引用类型

时间:2015-05-07 19:50:19

标签: c# .net oop generics types

我搜索了generic type in C#并得出了这个结论:

  1. 所有参考类型均基于Class
  2. 所有值类型均基于struct
  3. 除了值和引用类型之间的全局差异之外,struct和class之间的主要区别是:

    • struct

    • 中没有继承
    • 结构不能包含空构造函数(不带参数)

  4. 泛型类型有六种基本实现:
  5.   
        
    • 其中T:class ==>通用参数必须是引用类型

    •   
    • 其中T:classA ==>泛型参数必须是。的实例   class classA

    •   
    • 其中T:InterfaceA ==> generic参数必须实现接口 InterfaceA

    •   
    • 其中T:New()==>泛型参数必须是一个类+有一个   默认空构造函数

    •   
    • 其中T:U ==>泛型参数必须派生类 U 或   实施界面 U

    •   
    • 其中T:struct ==> generic参数必须是值类型

    •   

    所以我需要知道:

    1. 如果我的结论是正确的?
    2. 我无法理解:
    3. 之间的区别
        
          
      • 其中T:New()==>具有空构造函数的类

      •   
      • 其中T:class,New()==>具有空构造函数的类

      •   

      为什么使用第二种形式?为什么我们不使用第一个?

      谢谢,

3 个答案:

答案 0 :(得分:10)

您所描述的是通用约束

  

其中T:New()==>泛型参数必须是类+具有默认的空   构造

不,那只是说"类型参数必须有一个无参数构造函数"。这实际上包括所有值类型。即使你不能在C#6之前为结构声明自己的无参数构造函数,你总是可以调用它们。例如:

Guid guid = new Guid();

所以如果你有:

public void Foo<T>() where T : new()

调用

非常有效
Foo<Guid>();

答案 1 :(得分:2)

泛型约束new()表示该类型具有无参数构造函数。该类型可以是结构或类。结构不能提供自定义无参数构造函数,这是因为所有结构都已经为它们提供了无参数构造函数,并且默认行为它们无法更改。它并不意味着永远不能使用无参数构造函数创建结构。

答案 2 :(得分:1)

  

struct不能包含空构造函数(不带参数)。

不正确。结构将始终具有无参数构造函数。但是,您不能从自动获得的默认无参数构造函数中更改它。