ความเข้าใจของคุณเป็นเรื่องจริง ฟังดูเหมือนจะพยายามเพิ่มประสิทธิภาพให้ฉัน คุณควรใช้นักแสดงปกติเมื่อคุณแน่ใจในประเภท นอกเหนือจากการสร้างข้อยกเว้นที่สมเหตุสมผลมากขึ้นแล้วมันยังล้มเหลวอย่างรวดเร็ว หากคุณคิดผิดเกี่ยวกับประเภทของโปรแกรมของคุณจะล้มเหลวทันทีและคุณจะสามารถเห็นสาเหตุของความล้มเหลวได้ทันทีแทนที่จะรอสักครู่NullReferenceException
หรือArgumentNullException
มีข้อผิดพลาดเชิงตรรกะในอนาคต โดยทั่วไปการas
แสดงออกที่ไม่ได้ตามมาด้วยการnull
ตรวจสอบที่ไหนสักแห่งเป็นกลิ่นรหัส
ในทางกลับกันหากคุณไม่แน่ใจเกี่ยวกับนักแสดงและคาดว่าจะล้มเหลวคุณควรใช้as
แทนที่จะใช้บล็อกธรรมดาที่มีtry-catch
บล็อก นอกจากนี้as
แนะนำให้ใช้มากกว่าการตรวจสอบประเภทตามด้วยนักแสดง แทน:
if (x is SomeType)
((SomeType)x).SomeMethod();
ซึ่งสร้างisinst
คำแนะนำสำหรับis
คำหลักและcastclass
คำแนะนำสำหรับนักแสดง (ประสิทธิภาพในการส่งนักแสดงสองครั้ง) คุณควรใช้:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
สิ่งนี้จะสร้างisinst
คำสั่งเท่านั้น วิธีการก่อนหน้านี้มีข้อบกพร่องที่อาจเกิดขึ้นในแอพพลิเคชั่นแบบมัลติเธรดเนื่องจากสภาพการแข่งขันอาจทำให้ตัวแปรเปลี่ยนประเภทหลังจากการis
ตรวจสอบสำเร็จและล้มเหลวที่ไลน์คาสต์ วิธีการหลังไม่น่าจะเกิดข้อผิดพลาดนี้
ไม่แนะนำวิธีแก้ไขปัญหาต่อไปนี้เพื่อใช้ในรหัสการผลิต หากคุณเกลียดการสร้างพื้นฐานใน C # จริงๆคุณอาจลองเปลี่ยนมาใช้ VB หรือภาษาอื่น ๆ
ในกรณีที่ผู้หนึ่งเกลียดไวยากรณ์การร่ายเขาสามารถเขียนวิธีการขยายเพื่อเลียนแบบนักแสดง:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
และใช้ไวยากรณ์ [?] ที่เรียบร้อย:
obj.To<SomeType>().SomeMethod()