C#值类型初始化

C#值类型初始化,c#,.net,C#,.net,我在上面提到的文章中读到。 “每种值类型都有一个隐式默认构造函数,用于初始化该类型的默认值。” 但在这篇文章中,Jon Skeet说 “C#中的基本规则是“任何类型的默认值都不能依赖于任何初始化” 如评论中所述。 默认值始终为“擦除内存后得到的结果”。您不能提供任何始终被调用的显式实现 有谁能告诉我谁是对的吗 当一个值类型被声明,它的构造函数被调用,或者内存被清除时,实际会发生什么 当一个值类型被声明为其构造函数时,实际会发生什么 调用或清除内存 假设您有以下内容: public struct

我在上面提到的文章中读到。 “每种值类型都有一个隐式默认构造函数,用于初始化该类型的默认值。”

但在这篇文章中,Jon Skeet说

“C#中的基本规则是“任何类型的默认值都不能依赖于任何初始化” 如评论中所述。 默认值始终为“擦除内存后得到的结果”。您不能提供任何始终被调用的显式实现

有谁能告诉我谁是对的吗

当一个值类型被声明,它的构造函数被调用,或者内存被清除时,实际会发生什么

当一个值类型被声明为其构造函数时,实际会发生什么 调用或清除内存

假设您有以下内容:

public struct Foo
{
    public int A { get; set; }
    public object B { get; set; }
}
然后分配一个
Foo

var f = new Foo();
编译器发出以下调用:

将指定地址处的值类型的每个字段初始化为 空引用或相应基元类型的0

然后描述它们是如何初始化的:

initobj指令初始化值类型的每个字段 由推送地址(类型为native int、&或*)指定给 空引用或相应基元类型的0。在此之后 方法时,实例已准备好使用构造函数方法 如果typeTok是引用类型,则此指令具有相同的 效果为ldnull后跟stind.ref。与Newobj不同,initobj会 不调用构造函数方法。Initobj用于初始化 值类型,而newobj用于分配和初始化对象。

所有这些事实都证明了一个事实,即值类型确实得到了初始化(从您的问题来看,您可能会对该语句提出质疑)

请注意,从C#6.0开始,您可以为值类型声明一个默认的无参数构造函数。如果您这样做,如果您通过
new
操作符显式实例化您的值类型,将调用该构造函数

:

表达式“new Person()”将执行声明的构造函数 而不是提供默认值的标准行为。注意, 但是,“默认(人员)”仍将产生默认值, 每个数组元素的“new Person[…]”也是如此 构造函数不会被执行:只有当您显式使用 结构类型上的“新建”

清除它的人对于所有托管CLR类型都是一样的,垃圾收集器。它会注意到它不再被指向,并将收集该类型并发挥其魔力

当一个值类型被声明为其构造函数时,实际会发生什么 调用或清除内存

假设您有以下内容:

public struct Foo
{
    public int A { get; set; }
    public object B { get; set; }
}
然后分配一个
Foo

var f = new Foo();
编译器发出以下调用:

将指定地址处的值类型的每个字段初始化为 空引用或相应基元类型的0

然后描述它们是如何初始化的:

initobj指令初始化值类型的每个字段 由推送地址(类型为native int、&或*)指定给 空引用或相应基元类型的0。在此之后 方法时,实例已准备好使用构造函数方法 如果typeTok是引用类型,则此指令具有相同的 效果为ldnull后跟stind.ref。与Newobj不同,initobj会 不调用构造函数方法。Initobj用于初始化 值类型,而newobj用于分配和初始化对象。

所有这些事实都证明了一个事实,即值类型确实得到了初始化(从您的问题来看,您可能会对该语句提出质疑)

请注意,从C#6.0开始,您可以为值类型声明一个默认的无参数构造函数。如果您这样做,如果您通过
new
操作符显式实例化您的值类型,将调用该构造函数

:

表达式“new Person()”将执行声明的构造函数 而不是提供默认值的标准行为。注意, 但是,“默认(人员)”仍将产生默认值, 每个数组元素的“new Person[…]”也是如此 构造函数不会被执行:只有当您显式使用 结构类型上的“新建”


清除它的人对于所有托管CLR类型都是一样的,垃圾收集器。它会注意到它不再被指向,并会收集该类型并发挥其魔力。

这两个链接并不相互矛盾。如果你能解释一下你为什么这么认为,那会有所帮助

您似乎认为“任何类型的默认值都不能依赖于任何初始化”意味着“值类型不能初始化”,这是不正确的


Jon在这里的意思是(而且确实是说)“用户不能为值类型提供自定义构造函数”。

这两个链接并不相互矛盾。如果你能解释一下你为什么这么认为,那会有所帮助

您似乎认为“任何类型的默认值都不能依赖于任何初始化”意味着“值类型不能初始化”,这是不正确的


Jon的意思是说(并且确实说)用户不能为值类型提供自定义构造函数“

这真的一点也不神秘。所有值类型都是使用隐式默认构造函数初始化的,该构造函数负责为类型指定默认值。实际上,这里有一个链接显示了每种值类型的默认值


这真的一点也不神秘。所有值类型都是使用隐式默认构造函数初始化的,该构造函数负责为类型指定默认值。实际上,这里有一个链接显示了每种值类型的默认值

I t