Pemahaman Anda benar. Kedengarannya seperti mencoba mengoptimalkan mikro untuk saya. Anda harus menggunakan gips normal ketika Anda yakin akan tipenya. Selain menghasilkan pengecualian yang lebih masuk akal, itu juga gagal cepat. Jika Anda salah tentang asumsi Anda tentang jenis ini, program Anda akan segera gagal dan Anda akan dapat melihat penyebab kegagalan dengan segera daripada menunggu untuk NullReferenceExceptionatau ArgumentNullExceptionatau bahkan kesalahan logis di masa depan. Secara umum, asekspresi yang tidak diikuti oleh nullcek di suatu tempat adalah bau kode.
Di sisi lain, jika Anda tidak yakin tentang gips dan mengharapkannya gagal, Anda harus menggunakan asgips biasa yang dibungkus dengan try-catchblok. Selain itu, penggunaan asdirekomendasikan atas cek tipe diikuti oleh pemain. Dari pada:
if (x is SomeType)
((SomeType)x).SomeMethod();
yang menghasilkan isinstinstruksi untuk iskata kunci, dan castclassinstruksi untuk para pemain (secara efektif melakukan pemeran dua kali), Anda harus menggunakan:
var v = x as SomeType;
if (v != null)
v.SomeMethod();
Ini hanya menghasilkan isinstinstruksi. Metode sebelumnya memiliki cacat potensial dalam aplikasi multithreaded karena kondisi balapan dapat menyebabkan variabel untuk mengubah jenisnya setelah iscek berhasil dan gagal pada garis gips. Metode terakhir tidak rentan terhadap kesalahan ini.
Solusi berikut tidak disarankan untuk digunakan dalam kode produksi. Jika Anda benar-benar membenci konstruksi mendasar seperti itu di C #, Anda dapat mempertimbangkan beralih ke VB atau bahasa lain.
Jika seseorang sangat membenci sintaksis pemeran, ia dapat menulis metode ekstensi untuk meniru pemeran:
public static T To<T>(this object o) { // Name it as you like: As, Cast, To, ...
return (T)o;
}
dan gunakan sintaksis rapi [?]:
obj.To<SomeType>().SomeMethod()