应利用基本类型默认值特性与default表达式实现无冗余多路分支:default(t)提供安全泛化初始值,配合模式匹配、对象/集合初始化器及零值感知分支,使“无显式赋值”成为自然默认路径。
直接用基本类型的默认值特性,配合简洁的条件表达式或模式匹配,就能写出清晰、无冗余的多路默认分支逻辑。关键不是堆 if-else,而是让“无显式赋值”本身成为默认路径的自然结果。
利用 default 表达式统一兜底
C# 的 default(T) 对所有类型都给出语义合理的初始值:数值为 0、引用为 null、bool 为 false、struct 为各字段默认值。这比硬写 null 或 0 更安全、更泛化。
- 在泛型方法中直接用
default作返回值或参数默认值,避免类型特化判断 - 比如:
T GetValueOrDefault<t>(string key) => dict.TryGetValue(key, out T v) ? v : default;</t> - 搭配可空类型(
int?、bool?)时,default自动是null,天然适配“未命中”语义
用对象/集合初始化器替代分支赋值
当多路分支最终都构造同类对象(如 DTO、配置项、响应体),与其逐个 new + set,不如用对象初始值设定项 + 条件表达式组合:
var result = condition switch { true => new Response { Code = 200, Msg = "OK" }, false => new Response { Code = 404, Msg = "Not Found" } };- 若某分支无需设字段,直接写
new Response()—— 所有属性自动取默认值,无需显式写Msg = null或Code = 0 - 对字典等集合,用集合初始值设定项:
new Dictionary<string int> { ["a"] = 1, ["b"] = default }</string>,其中default明确表示“此处用 int 默认值 0”
结合模式匹配做零值感知分支
现代 C# 支持对 null、0、false 等“默认态”做直接模式匹配,把“是否为默认值”本身变成分支条件:
-
return value switch { 0 => "zero", _ => "non-zero" };(int) return obj switch { null => "missing", { Name: null } => "name missing", _ => "ok" };- 这样,“默认值”不再是被忽略的 fallback,而是主动参与决策的一等公民,逻辑更直白
避免手动重复初始化字段
类中字段若未显式赋值,编译器自动按类型默认值初始化。合理利用这点,能大幅精简构造函数和初始化代码:
- 不必在构造函数里写
this.IsActive = false;—— bool 字段默认就是 false - 不必写
this.Items = new List<string>();</string>—— 如果业务允许空集合为默认态,就让它保持 null;若必须非空,再用??= new()延迟初始化 - 结构体(struct)所有字段自动初始化为 default,无需无参构造函数干预










