rab*_*ani 12 c# clr stack struct
我想试试这段代码:
public struct Direction
{
   private int _azimuth;
   public int Azimuth
   {
     get { return _azimuth; }
     set { _azimuth = value; }
   }       
   public Direction(int azimuth)
   { 
      Azimuth = azimuth
   } 
}
但它在编译时失败,我理解struct需要初始化它的所有字段.但我想了解在CLR\IL引擎盖下发生了什么.为什么它需要在任何其他方法\ property\this等之前的所有字段
谢谢.
Gis*_*shu 10
值类型是在堆栈上创建的(除非嵌套在引用类型中)堆栈上的字段/位置有些东西,CLR无法保证它们将被清零(与托管堆上的字段/位置相反)保证被清零).因此,在阅读之前必须写入它们.否则这是一个安全漏洞.
struct的默认ctor(不带参数,你不允许显式指定)将结构的所有字段清零,因此你可以使用结构.
new BimonthlyPairStruct()
然而,当你实现你的参数构造函数,你必须确保所有的字段都被初始化-这是必需的CLR通过您的代码安全/ 验证.
另见:CLR通过C#2nd Ed - Pg 188
这是因为结构派生自System.ValueType而不是System.Object,System.ValueType实现了您无法覆盖的默认构造函数,此默认构造函数使用其默认值初始化struct中的所有字段.因此,如果要在类中实现任何参数构造函数,则还需要t0确保调用system.ValueType default const.并且为了回答为什么需要初始化它的所有值,这是因为值存储在堆栈内存中.
这有效:
  public Direction(int azimuth)
  {
    _azimuth = azimuth;
  }
从规格:
使用new运算符调用Struct构造函数,但这并不意味着正在分配内存.结构构造函数只是返回结构值本身(通常在堆栈的临时位置),而不是动态分配对象并返回对它的引用,然后根据需要复制该值.
基本上,编译器必须看到每个字段都在构造函数中初始化,以便它可以复制这些值,并且它不愿意检查对函数或属性的调用.
| 归档时间: | 
 | 
| 查看次数: | 6406 次 | 
| 最近记录: |