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

