定义一个C#结构,为啥不能在结构中,给里面的字段赋初始值?
假如在结构中,声明字段为static类型,是不是就可以给字段赋初始值了呢?
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
一个关于C#结构的问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- threenewbee 2018-11-14 13:32关注
这个要从“给里面的字段赋初始值”的本质说起。
在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#不需要再用结构体做和类一样的事情
那么在有类的同时还有结构体,结构体肯定是有类不擅长,不能胜任的地方
这个地方就是性能方面的优化
对于类来说,创建一个对象,必须调用构造函数,这个就很慢了
但是结构体不需要,因此直接开辟内存,结构体就创建了。
类似的,复制一个类的对象,需要调用拷贝构造函数
结构体只要复制内存就可以了。
既然结构体要快,要直接复制内存,所以自然就不允许有构造函数了,否则结构体又变成类了。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 metadata提取的PDF元数据,如何转换为一个Excel
- ¥15 关于arduino编程toCharArray()函数的使用
- ¥100 vc++混合CEF采用CLR方式编译报错
- ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
- ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
- ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
- ¥50 如何openEuler 22.03上安装配置drbd
- ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
- ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
- ¥15 Windows11, backspace, enter, space键失灵