"is { }" 是什么意思?

What does "is { }" mean?

我有时会看到下面的代码,但不知道表达式实际测试的是什么。

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}

这只是 C# 8 中的空 属性 模式,意味着值不是 null。它匹配任何值类型或引用类型。正如 Panagiotis Kanavos 在评论中指出的那样,这相当于在 C# 中使用了很长时间的旧 value is object 检查。

一般来说,如果你要指定一个属性,那么它会匹配或不匹配。这个深奥的例子说明:

if (value is { Length: 2 })
{
   // matches any object that isn't `null` and has a property set to a length of 2
}

switch 表达式等情况下,与其他模式相比,属性 模式效果最好且最清晰。

虽然 Daniel 的回答是正确的,但我认为添加一些关于 为什么 您可能会看到正在使用的空 属性 模式的上下文可能会有用。考虑这个需要完成一些验证的示例控制器方法:

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

在上面,ValidateId() 可以 return 为 null 或 BadObjectRequestResult 的实例。如果前者是 returned,则验证成功并继续 Update 的其余部分。如果后者是 returned,is {}true(即 BadObjectRequestResult 的实例当然是 object),并且验证失败。

很好,除此之外,我们还提供了一个变量名 invalid,我们可以立即 return。否则我们将需要稍微冗长的代码。

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

无论是一种更具可读性还是另一种取决于 reader,我只是介绍了一种可以使用空 属性 模式的方法。

我认为是检查值是否为空对象