"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,我只是介绍了一种可以使用空 属性 模式的方法。
我认为是检查值是否为空对象
我有时会看到下面的代码,但不知道表达式实际测试的是什么。
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,我只是介绍了一种可以使用空 属性 模式的方法。
我认为是检查值是否为空对象