C#中结构和类的默认构造函数

不想看我废话直接看这个链接就行:

https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/new-operator

研究这个的起因还是C#的类的字段可以赋值初始化,而在C++中是不行的(除了const static int(枚举)这种成员变量),原因是类声明时并未分配空间,而后查了一些资料才得知这是C#编译器将初始化语句自动放到了构造函数中,这就对上了,可为什么结构不行呢?为什么不对结构也进行这种优化,使得可以在写结构时对一些字段直接赋值初始化呢?

用代码实测,发现不仅不能直接对字段赋值,还不能自定义结构的默认构造函数(C++可以),自定义带参数的构造函数还必须对所有字段赋值,我去,说好比C++简单点的呢?为啥要求这么多?

其实说到底,就是这个默认构造函数一个问题了请记住,为 struct 声明默认构造函数是错误的,因为每个值类型均隐式含有公共默认构造函数。这句话的重点就是公共这个词了,也就是说C#编译器在遇到类似这样的代码:

struct stu
{
    int age;
    string name;
}
int i = new int();
float i1 = new float();
stu xiaoming = new stu();

处理方式可能是调用同一个构造函数(这部分代码看不到,只是推测),那么此时编译器显然不会允许程序员再声明默认构造函数,这样会导致二义性,编译器不知道用哪个方法。

再回到之前的问题,既然是公用的,编译器也就不能对其进行修改,否则下次新建值类型时,就不能正确初始化为默认值。所以也就不能声明时对字段赋值。至于必须对每个字段赋值,则是因为C#必须要显式对变量赋初值,否则编译不通过。



猜你喜欢

转载自blog.csdn.net/chrisxiaoniu/article/details/80922973