不想看我废话直接看这个链接就行:
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#中结构体和类在默认构造函数方面的差异。C#允许类在声明时对字段赋值初始化,而结构体则不允许,原因在于结构体的默认构造函数是隐式的,且不允许程序员自定义。C#的这种设计避免了二义性,并确保值类型的正确初始化。对于类,编译器会将初始化语句自动放到构造函数中,而结构体则需要显式赋值以符合编译要求。
最低0.47元/天 解锁文章
138

被折叠的 条评论
为什么被折叠?



