回答:
これは、C#8の空のプロパティパターンです。 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ですか?
ダニエルの答えは正しいですが、使用中の空のプロパティパターンが表示される理由を説明するのに役立つと思います。いくつかの検証を行う必要のある、この例のコントローラーメソッドを考えます。
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;
...
}
どちらがより読みやすいか、またはもう一方が読者次第であるかに関係なく、空のプロパティパターンを使用できる1つの方法を紹介しました。
is object invalidではないis {} invalid
IActionResultが必要なため、この場合は機能しません(技術的にはTask<IActionResult>)。私たちがあなたのスタイルで行くならif、同じ結果にinvalidなりますが、objectこれはコンパイルされません。