“ คือ {}” หมายความว่าอะไร


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ไม่แน่นอนว่าเป็นโมฆะ is {}มีการจดชวเลขis objectและสตริงสามารถส่งไปยังวัตถุ
Panagiotis Kanavos

6
@OlegI เป็นอย่างไร มันเป็นข้อมูลอ้างอิงที่ถูกต้องเพื่อให้ตรงกับ
Daniel A. White

3
โลกใหม่ที่ structs สามารถเป็นโมฆะและไม่สามารถอ้างอิงเป็นโมฆะงบสวิทช์จะกลับและต่างๆ!, !!, ?และ??ก่อนและหลังคุณสมบัติหมายถึงสิ่งที่แตกต่างกัน น้ำตาลซินแทคติคจะสูงเมื่อใด
ja72

3
มันเหมือนกันvalue != nullไหม?
ca9163d9

7

ในขณะที่คำตอบของ Daniel ถูกต้องฉันคิดว่าอาจเป็นประโยชน์ในการเพิ่มบริบทเกี่ยวกับสาเหตุที่คุณอาจเห็นรูปแบบของคุณสมบัติที่ว่างในการใช้งาน พิจารณาตัวอย่างเมธอดคอนโทรลเลอร์ที่ต้องการการตรวจสอบความถูกต้อง:

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

ในข้างต้นจะกลับโมฆะหรือตัวอย่างของValidateId() หากอดีตจะถูกส่งกลับการตรวจสอบจะประสบความสำเร็จและย้ายไปยังส่วนต่างๆของร่างกายของBadObjectRequestResult Updateหากหลังถูกส่งคืนis {}เป็นจริง (เช่นแน่นอนว่าอินสแตนซ์ของBadObjectRequestResultเป็นobject) และการตรวจสอบล้มเหลว

ทางเราได้ตั้งชื่อตัวแปรinvalidซึ่งเราสามารถกลับมาได้ทันที หากปราศจากว่าเราต้องการรหัส verbose มากกว่านี้เล็กน้อย

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

ไม่ว่าจะเป็นหนึ่งสามารถอ่านได้มากขึ้นหรืออื่น ๆ ขึ้นอยู่กับผู้อ่านฉันเพียงแค่นำเสนอวิธีหนึ่งที่รูปแบบคุณสมบัติที่ว่างเปล่าสามารถใช้


ในกรณีนั้นควรใช้is object invalidไม่ใช่is {} invalid
Panagiotis Kanavos

1
@PanagiotisKanavos ที่ไม่สามารถใช้งานได้ในกรณีนี้เนื่องจากIActionResultจำเป็นต้องส่งคืน(มีเทคนิคดีTask<IActionResult>) ถ้าเราไปกับสไตล์ของคุณifผลลัพธ์ก็invalidจะเหมือนกัน แต่จะเป็นobjectเช่นนั้นสิ่งนี้จะไม่รวบรวม
Kit

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.