如果结构是值类型,为啥我可以新建它? [复制]

Posted

技术标签:

【中文标题】如果结构是值类型,为啥我可以新建它? [复制]【英文标题】:If a struct is a value type why can I new it? [duplicate]如果结构是值类型,为什么我可以新建它? [复制] 【发布时间】:2013-03-13 11:29:33 【问题描述】:

在 C# 中,结构是值类型,但我可以 new 它们就像它们是引用类型一样。这是为什么呢?

【问题讨论】:

构造函数实际上只是一种方法,它在对象被认为初始化之前获得了弄乱对象的特权。 【参考方案1】:

因为他们有构造函数。

new operator 并不意味着“这是一个引用类型”;它的意思是“这种类型有一个构造函数”。当您new 某事时,您创建了一个实例,并在此过程中调用了构造函数。

就此而言,所有值和引用类型都有构造函数(如果类型本身没有定义任何参数,至少默认构造函数不接受任何参数)。

【讨论】:

谢谢。对于 Java,“所有值和引用类型都有构造函数”是否也成立? @Ben:我知道 Java 原始类型也有构造函数。 谢谢。但是为什么***.com/a/47024170new不能适用于int @Ben:因为 Java 不允许? 如何证明Java中的int有构造函数?【参考方案2】:

在 MSDN 文档中说对 here,new 运算符用于调用值类型的默认构造函数。

【讨论】:

【参考方案3】:

您不必使用 new 运算符来创建结构。如果你这样做,它将调用它的构造函数,如果你不这样做,所有字段都将保持未分配状态。

【讨论】:

【参考方案4】:

new 运算符并不意味着它只能用于引用类型。它也可以与值类型一起使用。

来自new Operator

用于创建对象调用构造函数

由于每个值类型都隐含地有一个公共的默认构造函数,所有的值类型都有默认值。你可以阅读Default Values Table。

例如;

int i = new int(); // i will be 0 for because its default values.

结构类型的默认值;

通过将所有值类型字段设置为它们的默认值产生的值 values 和所有引用类型字段为 null

也来自MSDN:

当你使用 new 操作符创建一个结构对象时,它会得到 创建并调用相应的构造函数。与班级不同, 无需使用 new 运算符即可实例化结构。如果你这样做 不使用新的,字段将保持未分配,对象不能 在所有字段都初始化之前一直使用。

【讨论】:

+1 一样快,对于 msdn 链接。也许删除(v=vs.71) 部分? 看到已更正,但无法 +2 ..【参考方案5】:

您也可以“新建”一个整数。 不同之处在于您不能按值传递引用类。

【讨论】:

以上是关于如果结构是值类型,为啥我可以新建它? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

matlab:将句柄类复制为值类

Golang复制结构体

Golang复制结构体

c# 泛型为啥能解决装箱拆箱问题

函数在 Swift 中是值类型还是引用类型?为啥?

C++/CLI 值类约束不会编译。为啥?