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

C# 12主构造函数两种写法:哪种更符合最佳实践?

C# 12 主构造函数两种写法的优劣对比

C# 12 引入的主构造函数特性简化了类的定义,你提到的两种写法各有适用场景,没有绝对的"最优",具体选择可以参考以下分析:

两种写法的核心区别

  • 第一种写法:将主构造函数参数显式赋值给readonly私有字段,通过私有字段访问依赖。
  • 第二种写法:直接使用主构造函数参数,此时参数会被编译器隐式转换为类的私有字段,但这个字段默认不是readonly的。

风险与安全性分析

第二种写法的风险在于:如果类中存在其他方法不小心对主构造函数参数进行赋值操作(比如service = new OtherService();),会直接修改类的依赖实例,引发意外行为。而第一种写法通过readonly字段锁定了依赖,从语法层面杜绝了这种修改可能。

不过在一些特定场景下(比如你示例中的ASP.NET Core控制器),控制器实例由DI容器创建,且在生命周期内不会被手动修改依赖,这种风险发生的概率极低。

更优的折中方案

其实C# 12支持给主构造函数参数直接添加readonly修饰符,这样既能保留第二种写法的简洁性,又能获得第一种写法的安全性:

public class ExampleController(readonly IService service) : ControllerBase
{
    [HttpGet]
    public ActionResult<Distance> Get()
    {
        return service.GetDistance();
    }
}

选择建议

  • 如果你的类需要确保依赖不可被修改(比如不可变业务类、多线程场景下的类),优先选择显式readonly字段的写法,或者给主构造函数参数加readonly修饰符的简洁写法。
  • 如果类逻辑简单,不存在修改依赖的可能(比如简单的控制器、DTO类),直接使用无readonly的主构造函数参数写法完全没问题,代码更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:35:16