当前位置: 首页 > 编程语言 > C#

为什么我必须使用非默认构造函数初始化C#结构中的所有字段?Share

时间:2023-04-10 23:34:37 C#

为什么我必须使用非默认构造函数初始化C#结构中的所有字段?我试过这段代码:publicstructDirection{privateint_azimuth;publicintAzimuth{get{return_azimuth;}设置{_azimuth=值;}}publicDirection(intazimuth){Azimuth=azimuth}}但当我了解到struct需要初始化其所有字段时,它编译失败。但我想了解CLRIL的幕后情况。为什么在任何其他方法属性之前需要所有字段thisetc谢谢。值类型是在堆栈上创建的(除非嵌套在引用类型中)归零)。因此,它们必须先写后读。否则就是安全漏洞。struct的默认ctor(不带参数,不允许显式指定)将struct的所有字段置零,因此您可以使用struct。newBimonthlyPairStruct()但是,在实现参数化构造函数时,必须确保所有字段都已初始化-这是CLR将代码作为安全/验证传递所必需的。另请参阅:CLRviaC#2ndEd-Pg188这是因为结构派生自System.ValueType而不是System.Object,System.ValueType实现了一个您无法覆盖的默认构造函数,此默认构造函数使用其默认值初始化结构中的所有字段这。因此,如果您要在您的类中实现任何参数构造函数,您还需要确保调用system.ValueType默认常量。而要回答为什么需要初始化它所有的值,是因为这些值是保存在栈内存中的。这有效:publicDirection(intazimuth){_azimuth=azimuth;来自规范:Struct构造函数是用new运算符调用的,但这并不意味着正在分配内存。struct构造函数只返回struct值本身(通常在堆栈的临时位置),而不是动态分配对象并返回对它的引用,然后根据需要复制值。基本上,编译器必须看到每个字段都在构造函数中初始化,以便它可以复制值,并且不愿意检查对函数或属性的调用。我刚刚在MSDN论坛中发现了一条强制执行此规则的说明,因为如果使用无默认构造函数,则会跳过清零内存。因此,必须为所有字段提供初始化值,避免某些字段包含随机值。您可以轻松地调用无参数默认构造函数,代价是对某些字段进行两次初始化。我不知道这个解释是否正确,但听起来很有道理。当您定义非默认初始化程序时,C#要求您设置所有字段,因为它会跳过内存归零并允许您对其进行初始化-否则您必须进行双重初始化性能。如果您不关心(非常轻微的)性能影响,您总是可以将调用链接到:this()初始化程序,然后只初始化选定的字段。publicstructDirection{publicintAzimuth{get;私有集;}publicDirection(intazimuth):this(){Azimuth=azimuth;您需要初始化字段,而不是通过属性。以上是C#学习教程:为什么C#struct中的所有字段都必须用非默认构造函数初始化?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: