CLR via C#第八章:实例构造器(值类型)

  • 值类型不会自动产生无参构构造函数,C#甚至不允许结构体等值类型定义无参构造函数(CLR是允许无参构造函数的)
  • 值类型的初始化不会自动调用构造函数,必须要显示的调用

注意:只有当值类型的字段嵌套到引用类型中时,才会保证被初始化为0或者null。为了确保代码的“可验证性”,任何基于栈的值类型字段都必须在读取之前写入(赋值)。如果允许代码先读再写,就会造成安全漏洞。对于对于所有基于栈的值类型中的字段,C#和其他可生成“可验证”代码的编译器可以保证对他们进行“置零”,或至少保证在读取之前已经赋值,从而确保不会在运行时因为验证失败而抛出异常。这意味着完全忽略当前这个“注意”,,假定自己的值类型会初始化为0或null。

  • 为了“可验证性”,在访问所有的值类型之前,都需要对所有字段进行赋值。不然报错。
        class Program
        {
            static void Main(string[] args)
            {
                ddd d = new ddd(12,23);
                Console.ReadKey();
            }
        }
        public struct ddd
        {
            int x;
            double y;
            ddd(int s_x, double s_y)
            {
                x = s_x;
    
            }
        }

    错误列表:

  • 严重性    代码    说明    项目    文件    行    禁止显示状态
    错误    CS0171    在控制返回调用方之前,字段“ddd.y”必须完全赋值    Demo    D:\Visual Studio 2015\Projects\Demo\Demo\Program.cs    17    活动

解决方案:

 public struct ddd
    {
        int x;
        double y;
         public ddd(int s_x, double s_y)
        {
            this = new ddd();
            x = s_x;

        }
    }

在值类型的构造器中,this代表值类型本身的一个实例,用new 创建的值类型的一个实例可以赋值给this,在New的过程中,会将所有的字段置零(所以new的位置很关键,此处如果先是x=s_x之后调用,则创建的所有实例的字段值都为0),在引用类型的构造器中,this被认为是只读的,所以不能赋值。 

猜你喜欢

转载自blog.csdn.net/maoxiaohai123/article/details/84770007
今日推荐