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