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

Blazor中Razor/HTML代码的最优空值检查方式咨询

问题:Razor中遍历可空对象集合的更优空值检查方式

给定以下代码:

实体类定义

class foo
{
  public List<string> Values { get; set; } = new();
}

组件代码

foo? bar;

protected override async Task OnInitializedAsync()
{
    bar = await _ds.Get<foo>();
}

当前在Razor中使用的空值检查遍历方式:

@if (bar != null)
{
    @foreach(var x in bar.Values)
    {
        <MudSelectItem Value="x">@x</MudSelectItem>
    }
}

希望找到类似@foreachWhenNotnull(var x in bar.Values)的简便写法,且不想通过自定义组件实现,有没有更优方案?


几种简便方案

1. 空合并运算符直接兜底空集合

不用额外写if判断,直接在foreach的数据源里用空合并运算符??,当bar?.Values为null时,自动遍历一个空集合:

@foreach(var x in bar?.Values ?? Enumerable.Empty<string>())
{
    <MudSelectItem Value="x">@x</MudSelectItem>
}

这种方式最直接,无需额外代码,利用C#原生特性就能实现安全遍历。

2. 自定义扩展方法实现语义化写法

如果想要更接近你期望的语义,可以写一个简单的扩展方法(无需自定义组件):

// 放在项目的通用扩展类中即可
public static class EnumerableExtensions
{
    public static IEnumerable<T> OrEmptyIfNull<T>(this IEnumerable<T>? source)
    {
        return source ?? Enumerable.Empty<T>();
    }
}

之后在Razor中就能这样使用,语义更清晰:

@foreach(var x in bar?.Values.OrEmptyIfNull())
{
    <MudSelectItem Value="x">@x</MudSelectItem>
}

3. Null包容运算符(仅限安全场景)

如果你能确定bar赋值后Values一定不会为null(比如实体类中已经初始化了new()),可以用Null包容运算符!简化,但仅适用于数据源绝对安全的场景:

@foreach(var x in bar?.Values!)
{
    <MudSelectItem Value="x">@x</MudSelectItem>
}

注意:如果bar为null或Values被意外置为null,这种写法会抛出空引用异常,需谨慎使用。


内容的提问来源于stack exchange,提问作者Dorian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:05:20