qq_43412960 2018-11-14 12:51 采纳率: 78.6%
浏览 400
已采纳

一个关于C#结构的问题

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

  • 写回答

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#不需要再用结构体做和类一样的事情
    那么在有类的同时还有结构体,结构体肯定是有类不擅长,不能胜任的地方
    这个地方就是性能方面的优化
    对于类来说,创建一个对象,必须调用构造函数,这个就很慢了
    但是结构体不需要,因此直接开辟内存,结构体就创建了。
    类似的,复制一个类的对象,需要调用拷贝构造函数
    结构体只要复制内存就可以了。
    既然结构体要快,要直接复制内存,所以自然就不允许有构造函数了,否则结构体又变成类了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作