一个关于C#结构的问题

定义一个C#结构,为啥不能在结构中,给里面的字段赋初始值?
假如在结构中,声明字段为static类型,是不是就可以给字段赋初始值了呢?

c#

2个回答

这个要从“给里面的字段赋初始值”的本质说起。
在C#里,你写
class A
{
public int X = 1;
}
其实编译器会自动将变量初始化放在构造函数里,以上代码等价:
class A
{
public int X;
public A()
{
X = 1;
}
}
然后你就知道了,如果把class修改为struct
第一个代码自然报错,不允许初始化实例变量
第二个代码也报错,不允许定义无参构造函数
因为两个代码是一回事,所以因为不允许无参构造函数,所以不允许初始化实例变量
那么为什么结构体不允许无参数构造函数呢
如果是
class A
{
public int X = 1;
}
那么你写
A a;
a.X = 123;
那么不允许编译,说a没有初始化
把class A修改为struct A
那么如上代码没有任何问题,可以编译。
这说明,结构体不需要调用构造函数就能初始化。
那么问题又来了,为什么结构体不需要new初始化,类需要呢
首先,因为C#有类了,所以C#不需要再用结构体做和类一样的事情
那么在有类的同时还有结构体,结构体肯定是有类不擅长,不能胜任的地方
这个地方就是性能方面的优化
对于类来说,创建一个对象,必须调用构造函数,这个就很慢了
但是结构体不需要,因此直接开辟内存,结构体就创建了。
类似的,复制一个类的对象,需要调用拷贝构造函数
结构体只要复制内存就可以了。
既然结构体要快,要直接复制内存,所以自然就不允许有构造函数了,否则结构体又变成类了。

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复qq_43412960: 不知道回答上的踩是不是你点的,如果是的话,请点下向上的箭头修正下。如果不是,请忽略。谢谢
一年多之前 回复
qq_43412960
qq_43412960 大佬牛逼
一年多之前 回复

在结构中,字段的初始化时不允许的
struct Simple
{
public int x=0;
public int y=0
}
会出现编译错误;
正确写法如下:
struct Simple
{
public int X;
public int Y;

public Simple(int a,int b)
{
X=a;
Y=b;
}
}

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 这个写法需要注意,如果调用者不通过构造函数调用,会忽略初始化,并且结构体不能封闭无参数构造函数,具体解释看我的回答。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问