C#是否有value_or_execute或value_or_throw类null处理语法糖?
C# 处理null时快速返回/抛出异常的语法糖及替代写法
C#目前没有你设想的那种直接在赋值语句中完成null检查+自定义逻辑返回的语法糖,但有几种比冗长if-else更简洁的替代方案,适配不同场景:
1. 抛异常场景:?? throw 运算符
如果遇到null时需要抛出异常(而非返回),可以直接用??结合throw表达式,这是官方提供的语法糖:
int a = obtainA() ?? throw new InvalidOperationException("Fatal error");
这种写法紧凑且符合C#的null安全规范,静态分析器也能识别a在此之后非null。
2. 自定义逻辑后返回:模式匹配(C# 8.0+)
如果需要执行自定义逻辑(比如打印日志)再返回,C# 8.0引入的模式匹配可以将null判断和变量赋值合并,大幅简化代码:
int? nullableA = obtainA(); if (nullableA is not int a) { Console.WriteLine("Fatal error"); return; } // 此处可直接使用非null的a,静态分析器会自动识别
这种写法比原代码少了临时变量的显式赋值步骤,逻辑更连贯。
3. 重复场景:封装扩展方法
如果这类null检查+处理的逻辑频繁出现,可以封装扩展方法减少重复代码。比如针对值类型的通用处理:
public static class NullableExtensions { // 尝试获取值,失败时执行自定义逻辑 public static bool TryGetValueOrExecute<T>(this T? nullable, out T value, Action onNull) where T : struct { if (nullable.HasValue) { value = nullable.Value; return true; } onNull(); value = default; return false; } }
调用时只需:
if (!obtainA().TryGetValueOrExecute(out var a, () => Console.WriteLine("Fatal error"))) { return; } // 使用a
总结
- 抛异常优先用
?? throw,这是最贴合语法糖的方案; - 自定义返回逻辑用C# 8+的模式匹配写法,简洁且易读;
- 高频重复场景可以封装扩展方法,进一步减少冗余代码。
内容的提问来源于stack exchange,提问作者Julien BERNARD
相关产品推荐
相关产品推荐

