回答:
これは、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
これはコンパイルされません。