Mungkin Duplikat: Casting dibandingkan dengan menggunakan 'sebagai' kata kunci dalam CLR
Apa sebenarnya perbedaan antara kedua gips?
SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;
Biasanya, mereka berdua harus eksplisit gips untuk jenis tertentu?
Mantan akan melempar pengecualian jika jenis sumber dapat't menjadi cast untuk jenis target. Yang terakhir akan mengakibatkan sc2 menjadi null referensi, tapi tidak ada pengecualian.
[Sunting / sunting sumber]
Asli saya jawabannya adalah tentu saja yang paling menonjol perbedaan, tapi sebagai Eric Lippert poin out, it's tidak hanya satu. Perbedaan lainnya termasuk:
Dan akhirnya, dengan menggunakan 'sebagai' vs. cor operator, anda're juga mengatakan "aku'm tidak yakin jika ini akan berhasil."
Typecasting menggunakan "seperti" tentu saja jauh lebih cepat ketika pemain gagal, karena menghindari mengorbankan melemparkan pengecualian.
Tapi itu tidak lebih cepat ketika pemain berhasil. Grafik di http://www.codeproject.com/KB/cs/csharpcasts.aspx ini menyesatkan karena itu doesn't menjelaskan apa itu's ukur.
Intinya adalah:
Jika anda berharap para pemain untuk berhasil (yaitu kegagalan akan menjadi luar biasa), menggunakan cor.
Jika anda don't tahu apakah itu akan berhasil, gunakan "seperti" operator dan tes hasilnya null.
Perbedaan antara kedua pendekatan ini adalah bahwa yang pertama ((SomeClass)obj) dapat menyebabkan type converter untuk dipanggil.
Baik yang 'sebagai' operator "membantu" anda mengubur masalah anda dengan cara yang lebih rendah karena saat ini disediakan aplikasi yang tidak kompatibel contoh ini akan mengembalikan null, mungkin anda'll menyampaikan bahwa untuk metode yang akan menyebarkannya ke yang lain dan seterusnya dan akhirnya anda'll mendapatkan NullReferenceException yang akan membuat anda debugging lebih keras.
Don't penyalahgunaan itu. Langsung cor operator lebih baik dalam 99% kasus.
Berikut ini adalah cara yang baik untuk mengingat proses yang masing-masing dari mereka ikuti yang saya gunakan ketika mencoba untuk memutuskan mana yang lebih baik untuk keadaan yang sama seperti saya.
DateTime i = (DateTime)value;
// is like doing
DateTime i = value is DateTime ? value as DateTime : throw new Exception(...);
dan berikutnya akan mudah untuk menebak apa yang dilakukannya
DateTime i = value as DateTime;
dalam kasus pertama, jika nilai tidak bisa di cast dari pengecualian dilemparkan dalam kasus kedua, jika nilai tidak bisa menjadi pemain, saya adalah set ke null.
Jadi dalam kasus pertama yang sulit berhenti dilakukan jika pemain gagal di kedua cor lembut berhenti dibuat dan anda mungkin menemukan NullReferenceException nanti.
Untuk memperluas Rytmis's komentar, anda bisa't gunakan sebagai kata kunci struct (Nilai Jenis), karena mereka tidak memiliki nilai null.
Semua ini berlaku untuk jenis referensi, nilai jenis tidak menggunakan sebagai
kata kunci karena mereka tidak boleh null.
//if I know that SomeObject is an instance of SomeClass
SomeClass sc = (SomeClass) someObject;
//if SomeObject *might* be SomeClass
SomeClass sc2 = someObject as SomeClass;
Pemain sintaks lebih cepat, tapi hanya ketika sukses, it's jauh lebih lambat untuk gagal.
Praktek terbaik adalah untuk menggunakan sebagai
ketika anda don't tahu jenis:
//we need to know what someObject is
SomeClass sc;
SomeOtherClass soc;
//use as to find the right type
if( ( sc = someObject as SomeClass ) != null )
{
//do something with sc
}
else if ( ( soc = someObject as SomeOtherClass ) != null )
{
//do something with soc
}
Namun jika anda benar-benar yakin bahwa someObject
adalah sebuah contoh dari SomeClass
kemudian menggunakan cor.
Di .Net 2 atau di atas obat generik berarti bahwa anda sangat jarang harus un-diketik contoh referensi kelas, sehingga yang terakhir ini kurang sering digunakan.
Mereka'll membuang berbagai pengecualian.
() : NullReferenceException
seperti : InvalidCastException
Yang bisa membantu untuk debugging.
&Quot;seperti" kata kunci mencoba untuk melemparkan objek dan jika pemain gagal, null dikembalikan diam-diam. The () cast operator akan melempar pengecualian segera jika pemain gagal.
"Hanya menggunakan C# "seperti" kata kunci di mana anda mengharapkan pemain untuk gagal dalam non-kasus yang luar biasa. Jika anda mengandalkan pemain untuk berhasil dan siap untuk menerima setiap objek yang akan gagal, anda harus menggunakan () cast operator sehingga tepat guna dan bermanfaat pengecualian dilemparkan."
Untuk kode contoh dan penjelasan lebih lanjut: http://blog.nerdbank.net/2008/06/when-not-to-use-c-keyword.html