เหตุใด Resharper จึงชอบ“ ตาม” กับ“ เป็น”?


13

เมื่อฉันเขียนรหัสเช่นนี้โดยที่ obj เป็นตัวแปรท้องถิ่น:

if (obj is IMyInterface)
{
   var result = (IMyInterface)obj;
   // ....
}

Resharper เสนอให้เปลี่ยนเป็นรหัสดังนี้:

var result = obj as IMyInterface;
if (result != null)
{
   // ...
}

ฉันชอบแบบเก่าเนื่องจากไม่มีข้อยกเว้นสำหรับการอ้างอิงเป็นโมฆะโดยไม่ได้ตั้งใจ เหตุผลอะไรที่ทำให้เลือกรูปแบบอื่น?

ทำไม Resharper จึงแนะนำสิ่งนี้

คำตอบ:


25

ก่อนอื่นให้ดูคำตอบ Jon Skeetสำหรับคำถามทั่วไปเกี่ยวกับการคัดเลือกนักแสดงใน C #:

อย่าทำสิ่งนี้:

if (randomObject is TargetType)
{
    TargetType foo = (TargetType) randomObject;
    // Do something with foo
}

การตรวจสอบนี้ไม่เพียงสองครั้ง แต่อาจตรวจสอบสิ่งที่แตกต่างกันถ้า randomObject เป็นเขตข้อมูลแทนที่จะเป็นตัวแปรเฉพาะที่ เป็นไปได้ที่ "ถ้า" จะผ่าน แต่จากนั้นการโยนล้มเหลวหากเธรดอื่นเปลี่ยนค่าของ randomObject ระหว่างสอง

( ... )

หาก randomObject อาจเป็นอินสแตนซ์ของ TargetType และ TargetType เป็นประเภทอ้างอิงให้ใช้โค้ดดังนี้:

TargetType convertedRandomObject = randomObject as TargetType;
if (convertedRandomObject != null)
{
    // Do stuff with convertedRandomObject
}

จากนั้นดูหัวข้อที่คล้ายกัน:


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