“ {}”是什么意思?


36

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

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

Answers:


28

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

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

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

当与其他模式(例如switch表达式)进行比较时,属性模式最有效且最清晰。


1
在这种情况下,空物体是什么意思?空字符串,空格?
OlegI

3
@Oleg我不,不是。s绝对不是null。is {}是的简写,可以is object字符串强制转换为对象。
Panagiotis Kanavos

6
@OlegI怎么这样?它是有效的参考,因此可以匹配。
Daniel A. White

3
它是一个新的世界里,结构可以为空,引用不能为空,switch语句颠倒和各种!!!???之前和之后的性能意味着不同的事情。语法糖何时会高端?
ja72

3
一样value != null吗?
ca9163d9

7

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

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

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

好的,除此之外,我们还提供了一个变量名,invalid我们可以立即返回它。否则,我们将需要更多详细的代码。

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

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


在那种情况下,应该使用is object invalid,而不是is {} invalid
Panagiotis Kanavos

1
@PanagiotisKanavos在这种情况下不起作用,因为需要返回IActionResult(从技术上讲Task<IActionResult>)。如果我们采用您的样式,if则的结果相同,但是invalid将是,object因此无法编译。
Kit

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.