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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:55:42