ฉันเห็นโค้ดต่อไปนี้ในบางครั้งและไม่ทราบว่านิพจน์กำลังทดสอบอะไรอยู่
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
เช่นนั้นสิ่งนี้จะไม่รวบรวม
ฉันคิดว่ามันคือการตรวจสอบว่าค่าเป็นวัตถุว่างเปล่า