我有时会看到以下代码,但不知道该表达式实际在测试什么。
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表达式等情况下的其他模式进行比较时,属性模式效果最好,也最清晰。
虽然 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)
无论一种更易读还是另一种取决于读者,我刚刚介绍了一种可以使用空属性模式的方式。
| 归档时间: |
|
| 查看次数: |
995 次 |
| 最近记录: |