Answers:
那只是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
表达式)进行比较时,属性模式最有效且最清晰。
s
绝对不是null。is {}
是的简写,可以将is object
字符串强制转换为对象。
!
,!!
,?
和??
之前和之后的性能意味着不同的事情。语法糖何时会高端?
value != null
吗?
虽然Daniel的回答是正确的,但我认为添加一些有关为什么您可能会看到使用空属性模式的上下文可能很有用。考虑需要完成一些验证的示例控制器方法:
public async Task<IActionResult> Update(string id, ...)
{
if (ValidateId(id) is { } invalid)
return invalid;
...
}
在上面,ValidateId()
可以返回null或的实例BadObjectRequestResult
。如果返回前者,则验证成功,并继续进行到的其余部分Update
。如果返回后者,is {}
则为true(即,当然的实例BadObjectRequestResult
为object
),并且验证失败。
好的,除此之外,我们还提供了一个变量名,invalid
我们可以立即返回它。否则,我们将需要更多详细的代码。
public async Task<IActionResult> Update(string id, ...)
{
var invalid = ValidateId(id);
if (invalid != null)
return invalid;
...
}
无论是一种更具可读性还是另一种取决于读者,我只是介绍了一种可以使用空属性模式的方式。
is object invalid
,而不是is {} invalid
IActionResult
(从技术上讲Task<IActionResult>
)。如果我们采用您的样式,if
则的结果相同,但是invalid
将是,object
因此无法编译。