C#构造函数重载时如何调用字段初始值作为默认参数?
解决方案
C# 规范不允许在构造函数初始化器(也就是:this()或者:base()的括号内)使用this引用,因为此时实例的字段初始化还未执行,实例尚未完成构造,因此无法直接读取字段的默认值,你可以通过以下两种方案实现需求:
方案1:提取默认值为常量(推荐,适用于默认值为编译期常量的场景)
把重复的默认值提取为类级别的常量,字段初始化和构造函数调用都复用这个常量,完全消除重复代码:
private const string DefaultName = "Test"; private const int DefaultId = 1; private readonly string name = DefaultName; private readonly int id = DefaultId; public Demo(string name, int id) { this.name = name; this.id = id; } public Demo(int id):this(DefaultName, id) { }
后续需要修改默认值只需要改对应的常量定义一处即可,维护成本最低。
方案2:拆分构造函数公共逻辑(适用于默认值为运行时动态计算的场景)
如果默认值不是编译期常量(比如需要从配置读取、运行时生成),可以把构造函数的公共逻辑抽为私有方法,在构造函数内部调用,此时实例字段已经完成初始化,可以直接读取默认值:
private readonly string name = ComputeDefaultName(); // 运行时计算的默认值 private readonly int id = 1; public Demo(string name, int id) { Init(name, id); } public Demo(int id) { // 此时字段初始化已执行,this.name已经持有默认值 Init(this.name, id); } private void Init(string name, int id) { this.name = name; this.id = id; // 其他两个构造函数共用的初始化逻辑 }
如果你的全参构造没有额外逻辑,甚至可以简化成直接赋值,不需要抽公共方法:
private readonly string name = "Test"; private readonly int id = 1; public Demo(string name, int id) { this.name = name; this.id = id; } public Demo(int id) { this.id = id; // name会自动使用字段定义的默认值,无需额外赋值 }
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

