“是{}”是什么意思?

eva*_*van 38 c# c#-8.0

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

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ite 30

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

通常,如果您要指定一个属性,则它会匹配或不匹配。这个深奥的例子说明了:

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

在与switch表达式等情况下的其他模式进行比较时,属性模式效果最好,也最清晰。

  • @OlegI 怎么会这样?它是有效的参考,因此它匹配。 (6认同)
  • @Oleg我不,不是。`s` 绝对不为空。`is {}` 是 `is object` 的简写,字符串 *可以* 转换为对象。 (3认同)
  • 这是一个新世界,结构可以为空,引用不能为空,switch 语句是相反的,属性前后的各种 `!`、`!!`、`?` 和 `??` 意味着不同的东西。语法糖高端何时结束? (3认同)
  • 它和“value != null”一样吗? (3认同)

Kit*_*Kit 8

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

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

在上面,ValidateId()可以返回 null 或BadObjectRequestResult. 如果返回前者,则验证成功并移至 的其余部分Update。如果返回后者,is {}则为(即当然是 的实例BadObjectRequestResult是 an object),则验证失败。

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

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

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

  • @PanagiotisKanavos 在这种情况下不起作用,因为需要返回“IActionResult”(技术上来说是“Task&lt;IActionResult&gt;”)。如果我们采用您的风格,“if”具有相同的结果,但“invalid”将是一个“对象”,因此不会编译。 (3认同)