Apakah metode dipanggil dengan nilai nol atau apakah memberikan pengecualian referensi nol?
MyObject myObject = null;
myObject.MyExtensionMethod(); // <-- is this a null reference exception?
Jika demikian, saya tidak perlu memeriksa parameter 'ini' untuk nol?
c#
parameters
null
extension-methods
kekuatan
sumber
sumber
Cannot perform runtime binding on a null reference
.Jawaban:
Itu akan bekerja dengan baik (tidak terkecuali). Metode ekstensi tidak menggunakan panggilan virtual (yaitu menggunakan instruksi "panggilan", bukan "callvirt") sehingga tidak ada pemeriksaan nol kecuali Anda menulisnya sendiri dalam metode ekstensi. Ini sebenarnya berguna dalam beberapa kasus:
dll
Pada dasarnya, panggilan ke panggilan statis sangat harfiah - yaitu
menjadi:
di mana jelas tidak ada cek nol.
sumber
Selain jawaban yang benar dari Marc Gravell.
Anda bisa mendapatkan peringatan dari kompiler jika jelas bahwa argumen ini nol:
Bekerja dengan baik saat runtime, tetapi menghasilkan peringatan
"Expression will always cause a System.NullReferenceException, because the default value of string is null"
.sumber
Seperti yang sudah Anda temukan, karena metode ekstensi hanya metode statis dimuliakan, mereka akan dipanggil dengan
null
referensi yang dilewatkan, tanpaNullReferenceException
dilemparkan. Tapi, karena mereka terlihat seperti metode instan untuk penelepon, mereka juga harus bersikap seperti itu. Maka Anda harus, sebagian besar waktu, memeriksathis
parameter dan melemparkan pengecualian jika itunull
. Tidak apa-apa untuk melakukan ini jika metode secara eksplisit menanganinull
nilai - nilai dan namanya menunjukkan itu sebagaimana mestinya, seperti dalam contoh di bawah ini:Saya juga menulis posting blog tentang ini beberapa waktu yang lalu.
sumber
Nol akan diteruskan ke metode ekstensi.
Jika metode ini mencoba mengakses objek tanpa memeriksa apakah itu nol, maka ya, itu akan melempar pengecualian.
Seorang pria di sini menulis metode ekstensi "IsNull" dan "IsNotNull" yang memeriksa apakah referensi yang diberikan adalah nol atau tidak. Secara pribadi saya pikir ini adalah penyimpangan dan seharusnya tidak terlihat terang hari, tapi itu benar-benar valid c #.
sumber
Seperti yang ditunjukkan orang lain, memanggil metode ekstensi pada referensi nol menyebabkan argumen ini menjadi nol dan tidak ada hal lain yang akan terjadi. Ini memunculkan ide untuk menggunakan metode ekstensi untuk menulis klausa penjaga.
Anda dapat membaca artikel ini sebagai contoh: Cara Mengurangi Kompleksitas Siklon: Penjaga Klausa Versi singkatnya adalah ini:
Ini adalah metode ekstensi kelas string yang dapat dipanggil dengan referensi nol:
Panggilan berfungsi dengan baik hanya karena runtime akan berhasil memanggil metode ekstensi dengan referensi nol. Kemudian Anda dapat menggunakan metode ekstensi ini untuk menerapkan klausa penjaga tanpa sintaksis yang berantakan:
sumber
Metode ekstensi statis, jadi jika Anda tidak melakukan apa pun pada MyObject ini seharusnya tidak menjadi masalah, tes cepat harus memverifikasinya :)
sumber
Ada beberapa aturan emas ketika Anda ingin agar Anda dapat dibaca dan vertikal.
Dalam kasus Anda - DesignByContract rusak ... Anda akan melakukan beberapa logika pada instance nol.
sumber