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

