Mengapa Resharper lebih suka "apa adanya" daripada "apa adanya"?

13

Ketika saya menulis kode seperti ini, di mana obj adalah variabel lokal:

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

Resharper menawarkan untuk mengubahnya menjadi kode seperti ini:

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

Saya lebih suka yang pertama, karena tidak menawarkan peluang untuk pengecualian referensi nol yang tidak disengaja. Alasan apa yang ada untuk memilih bentuk yang lain?

Mengapa Resharper merekomendasikan ini?

Dave Hillier
sumber

Jawaban:

25

Pertama-tama lihat jawaban Jon Skeet untuk pertanyaan umum tentang casting dalam C #:

Jangan lakukan ini:

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

Tidak hanya memeriksa dua kali, tetapi mungkin memeriksa hal-hal yang berbeda, jika randomObject adalah bidang daripada variabel lokal. Itu mungkin untuk "jika" untuk lulus tetapi kemudian para pemain gagal, jika utas lain mengubah nilai objek acak antara keduanya.

(...)

Jika randomObject mungkin merupakan instance dari TargetType dan TargetType adalah tipe referensi, maka gunakan kode seperti ini:

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

Kemudian lihat topik serupa:

yee
sumber
1
+1 Lihat juga Posting Blog Eric Lippert tentang topik ini.
Brian