ใน C # 8 หนึ่งควรทำเครื่องหมายประเภทการอ้างอิงเป็น nullable อย่างชัดเจน
โดยค่าเริ่มต้นประเภทเหล่านั้นจะไม่สามารถมีโมฆะชนิดคล้ายกับประเภทค่า แม้ว่าสิ่งนี้จะไม่เปลี่ยนวิธีการทำงานของสิ่งต่าง ๆ ภายใต้ประทุนเครื่องตรวจสอบชนิดจะกำหนดให้คุณทำสิ่งนี้ด้วยตนเอง
รหัสที่ได้รับจะถูก refactored ให้ทำงานร่วมกับ C # 8 แต่มันไม่ได้รับประโยชน์จากคุณสมบัติใหม่นี้
public static Delegate? Combine(params Delegate?[]? delegates)
{
// ...[]? delegates - is not null-safe, so check for null and emptiness
if (delegates == null || delegates.Length == 0)
return null;
// Delegate? d - is not null-safe too
Delegate? d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
นี่คือตัวอย่างของรหัสที่ได้รับการอัปเดต (ไม่ทำงานเป็นเพียงแนวคิด) ใช้ประโยชน์จากคุณลักษณะนี้ มันช่วยเราจากการตรวจสอบแบบ null และทำให้วิธีนี้ง่ายขึ้นเล็กน้อย
public static Delegate? Combine(params Delegate[] delegates)
{
// `...[] delegates` - is null-safe, so just check if array is empty
if (delegates.Length == 0) return null;
// `d` - is null-safe too, since we know for sure `delegates` is both not null and not empty
Delegate d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
// then here is a problem if `Combine` returns nullable
// probably, we can add some null-checks here OR mark `d` as nullable
d = Combine(d, delegates[i]);
return d;
}