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

cwxwcias  于 2023-03-24  发布在  .NET
关注(0)|答案(3)|浏览(93)

我搜索了generic type in C#,得出了这样的结论:
1.所有引用类型都基于Class
1.所有值类型都基于struct
1.除了value和reference类型之间的全局差异外,struct和class之间的主要差异是:

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

1.泛型类型有六种基本实现:

  • 其中T:class ==〉泛型参数必须是引用类型
  • 其中T:classA ==〉泛型参数必须是类classA的示例
  • 其中T:InterfaceA ==〉泛型参数必须实现接口InterfaceA
  • 其中T:New()==〉泛型参数必须是一个类+有一个默认的空构造函数
  • 其中T:U ==〉泛型参数必须派生类U或实现接口U
  • 其中T:struct ==〉泛型参数必须是值类型

所以我需要知道:
1.如果我的结论是正确的?
1.我无法理解以下两者之间的区别:

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

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

oyt4ldly

oyt4ldly1#

你所描述的是通用的 * 约束 *。
其中T:New()==〉泛型参数必须是一个类+有一个默认的空构造函数
不,这只是说“类型参数必须有一个无参数构造函数”。这实际上包括 * 所有 * 值类型。即使你不能为C# 6之前的结构声明自己的无参数构造函数,你总是可以 * 调用 * 它们。例如:

Guid guid = new Guid();

因此,如果您有:

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

完全可以说

Foo<Guid>();
6qqygrtg

6qqygrtg2#

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

iezvtpos

iezvtpos3#

结构不能包含空构造函数(不带参数)。
不正确。该结构体总是有一个无参数构造函数。但是不允许你改变它,改变你自动得到的默认无参数构造函数。

相关问题