「{}」とはどういう意味ですか?


36

次のコードがときどき表示され、実際に式が何をテストしているのかわかりません。

public static void Something(string[] value)
{
   if (value is { })
   {
      DoSomethingElse();
   }
}

回答:


28

これは、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式などの場合に他のパターンと比較すると最も明確です。


1
この場合、空のオブジェクトはどういう意味ですか?空の文字列、空白?
OlegI

3
@OlegIいいえ、そうではありません。s間違いなくnullではありません。is {}は省略形でis objectあり、文字列をオブジェクトにキャストできます。
Panagiotis Kanavos

6
@OlegIどのように?これは有効な参照なので、一致します。
ダニエルA.ホワイト

3
構造体がnullおよび参照することができ、その新しい世界が、switch文はnullを逆にして、様々なされていることができない!!!?そして??前と後の特性は異なるものを意味します。構文糖ハイエンドはいつですか?
ja72

3
それは同じvalue != nullですか?
ca9163d9

7

ダニエルの答えは正しいですが、使用中の空のプロパティパターンが表示される理由説明するのに役立つと思います。いくつかの検証を行う必要のある、この例のコントローラーメソッドを考えます。

public async Task<IActionResult> Update(string id, ...) 
{
    if (ValidateId(id) is { } invalid)
        return invalid;
    ...
}

上記でValidateId()は、nullまたはのインスタンスを返す可能性がありますBadObjectRequestResult。前者が返された場合、検証は成功し、の本文の残りの部分に進みUpdateます。後者が返された場合is {}trueです(つまり、のインスタンスBadObjectRequestResultobject)、および検証は失敗します。

素敵なことに、この中から変数名も提供していますinvalid。これはすぐに返すことができます。それがなければ、もう少し詳細なコードが必要になります。

public async Task<IActionResult> Update(string id, ...) 
{
    var invalid = ValidateId(id);
    if (invalid != null)
        return invalid;
    ...
}

どちらがより読みやすいか、またはもう一方が読者次第であるかに関係なく、空のプロパティパターンを使用できる1つの方法を紹介しました。


その場合、一つは使うべきis object invalidではないis {} invalid
パナギオティスKanavos

1
@PanagiotisKanavosの戻りIActionResultが必要なため、この場合は機能しません(技術的にはTask<IActionResult>)。私たちがあなたのスタイルで行くならif、同じ結果にinvalidなりますが、objectこれはコンパイルされません。
キット

0

値が空のオブジェクトかどうかをチェックすることだと思います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.