You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#结构体自定义构造函数后仍可调用默认构造函数?

C#结构体默认构造函数的特殊规则

C#中值类型(包括结构体)的默认构造函数规则和你熟悉的C++/Java类完全不同:

  • 结构体始终自带默认无参构造函数,不管你有没有定义显式的带参构造。这个默认构造会把结构体的所有字段初始化为对应默认值:引用类型字段设为null,值类型字段设为类型默认值(比如char是\0,bool是false)。这就是new Separator()能通过编译的原因,运行时sb为null,调用Write()时自然触发空引用异常。

  • 对比C++/Java:C++的结构体和类遵循「无显式构造才生成默认构造」的规则;Java没有值类型结构体,类同样是无显式构造时才提供默认构造,所以你会产生认知偏差。

避免此类问题的可行方案

  • 显式定义无参构造(C# 10+支持):可以在结构体中添加无参构造,强制初始化逻辑(比如抛出异常提示),但要确保所有字段都被初始化:
    public Separator()
    {
        sb = throw new InvalidOperationException("必须使用带参构造创建实例");
        ch = ',';
        more = false;
    }
    
  • 在方法中添加前置检查:在Write()方法开头先校验sb是否为null,提前抛出明确异常:
    public void Write()
    {
        sb ??= throw new InvalidOperationException("sb未初始化,请使用带参构造创建实例");
        if (more)
            sb.Append(ch);
        more = true;
    }
    
  • 代码规范约束:通过文档、静态代码分析工具或访问修饰符(比如把结构体设为internal),禁止外部代码使用无参构造创建该结构体实例。

内容的提问来源于stack exchange,提问作者rwallace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:02:34