为何结构体的成员不能在声明时赋值,而class的成员可以
为什么结构体的成员不能在声明时赋值,而class的成员可以?
我写了一个结构体的声明:
结果,编译报错:
ConsoleApplication1.Program.m.m_i': cannot have instance field initializers in structs
-----------------------------------------------------------------------------------
C#这样设计的原因是什么? 为什么struct/class的初始化规则要不一样呢?
------解决方案--------------------
这绝对不是没有糖吃的问题,而是为了消除歧义。主要原因就是因为值类型没有默认的无参构造器,构造方式与引用类型是不同的。
------解决方案--------------------
值类型与引用类型的本质区别,仅仅是一个是直接寻址,一个是间接寻址。
与构造函数没有任何关系,这个条文不过是人为的规定而已,而不是因为技术实现上有什么问题。
------解决方案--------------------
C#本身就是为面向对象而生的,设计上把struct当成二等公民是很正常的,人家java都不支持struct。
------解决方案--------------------
另外有一点,值类型的继承也是很正常的需求,而且技术实现上比引用类型简单,然而C#却没有提供。
------解决方案--------------------
值类型其实是没有无参的构造器的。初始化时直接对内存进行的操作,将成员赋值为类型的默认值。
因为没有无参构造器,也就没法内联。
我写了一个结构体的声明:
struct m
{
int m_i = 0;
}
结果,编译报错:
ConsoleApplication1.Program.m.m_i': cannot have instance field initializers in structs
-----------------------------------------------------------------------------------
C#这样设计的原因是什么? 为什么struct/class的初始化规则要不一样呢?
------解决方案--------------------
这绝对不是没有糖吃的问题,而是为了消除歧义。主要原因就是因为值类型没有默认的无参构造器,构造方式与引用类型是不同的。
------解决方案--------------------
值类型与引用类型的本质区别,仅仅是一个是直接寻址,一个是间接寻址。
与构造函数没有任何关系,这个条文不过是人为的规定而已,而不是因为技术实现上有什么问题。
------解决方案--------------------
C#本身就是为面向对象而生的,设计上把struct当成二等公民是很正常的,人家java都不支持struct。
------解决方案--------------------
另外有一点,值类型的继承也是很正常的需求,而且技术实现上比引用类型简单,然而C#却没有提供。
------解决方案--------------------
值类型其实是没有无参的构造器的。初始化时直接对内存进行的操作,将成员赋值为类型的默认值。
因为没有无参构造器,也就没法内联。