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

如何在C#中仅当值非空时初始化对象属性,否则保留默认值?

解决方案

首先,假设你的类定义如下:

public class MyObj
{
    // 属性默认初始化为新的空列表
    public List<string> SomeList { get; set; } = new List<string>();
}

原来繁琐的写法是先实例化再判断赋值:

var obj = new MyObj();
if (myListThatMightBeNull != null)
{
    obj.SomeList = myListThatMightBeNull;
}

下面提供两种更简洁的实现方式:

方式一:利用null合并运算符复用实例默认值

用一行代码完成赋值逻辑,既保留类内定义的默认值,又避免重复初始化:

var obj = new MyObj();
obj.SomeList = myListThatMightBeNull ?? obj.SomeList;

原理:??运算符会返回第一个非null的值,如果myListThatMightBeNull不为null,就用它替换默认列表;否则保留实例原本的默认列表。

方式二:提取静态默认值,在对象初始化器中复用

如果希望在初始化器内完成所有逻辑,可以把默认值提取为类的静态成员,避免重复编写new List<string>():

public class MyObj
{
    private static readonly List<string> _defaultSomeList = new List<string>();
    public List<string> SomeList { get; set; } = _defaultSomeList;
}

// 初始化实例时
var obj = new MyObj
{
    SomeList = myListThatMightBeNull ?? MyObj._defaultSomeList
};

这种方式的好处是默认值只定义一次,后续修改默认逻辑时只需改动静态成员即可。

关于“反向??运算符”

C#目前没有专门的“反向null合并运算符”(即仅当右侧非null时才赋值的运算符),但上述两种写法已经能以简洁的方式实现你的需求,无需额外语法支持。

内容的提问来源于stack exchange,提问作者brent.reynolds

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:35:43