ฉันเห็นโค้ดต่อไปนี้ในบางครั้งและไม่ทราบว่านิพจน์กำลังทดสอบอะไรอยู่
public static void Something(string[] value)
{
if (value is { })
{
DoSomethingElse();
}
}
ฉันเห็นโค้ดต่อไปนี้ในบางครั้งและไม่ทราบว่านิพจน์กำลังทดสอบอะไรอยู่
public static void Something(string[] value)
{
if (value is { })
{
DoSomethingElse();
}
}
คำตอบ:
นั่นเป็นเพียงรูปแบบของสถานที่ว่างเปล่าใน 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ไม่แน่นอนว่าเป็นโมฆะ is {}มีการจดชวเลขis objectและสตริงสามารถส่งไปยังวัตถุ
!, !!, ?และ??ก่อนและหลังคุณสมบัติหมายถึงสิ่งที่แตกต่างกัน น้ำตาลซินแทคติคจะสูงเมื่อใด
value != nullไหม?
ในขณะที่คำตอบของ 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
IActionResultจำเป็นต้องส่งคืน(มีเทคนิคดีTask<IActionResult>) ถ้าเราไปกับสไตล์ของคุณifผลลัพธ์ก็invalidจะเหมือนกัน แต่จะเป็นobjectเช่นนั้นสิ่งนี้จะไม่รวบรวม
ฉันคิดว่ามันคือการตรวจสอบว่าค่าเป็นวัตถุว่างเปล่า