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
相关产品推荐
相关产品推荐

