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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:21:01