Pertanyaan Apakah “ReferenceEquals (myObject, null)” praktik yang lebih baik daripada “myObject == null”?


Saya memiliki rekan kerja yang merupakan penggemar menulis cek kosongnya sebagai berikut:

if (!ReferenceEquals(myObject, null))

Saya, di sisi lain, menemukan sintaksis ini rumit untuk dibaca dan disukai:

if (myObject != null)

Saya telah menemukan beberapa artikel dan tumpukan pertanyaan melimpah yang membahas manfaat dari ReferensiEquals sehubungan dengan operator overloading, tetapi di luar skenario operator overloading, apakah ada manfaat untuk ReferenceEquals vs ==?


32
2017-09-17 19:33


asal


Jawaban:


tetapi di luar skenario overloading operator, apakah ada manfaat untuk ReferenceEquals vs ==?

Tidak - satu-satunya keuntungan (dan saya berpendapat itu tidak banyak keuntungan) untuk secara eksplisit menggunakan Object.ReferenceEquals akan bahwa itu tidak akan pernah menggunakan operator yang sama kelebihan beban. Dalam kasus yang tidak kelebihan beban, == Operator didefinisikan sebagai "mengembalikan nilai true jika dua operandnya merujuk ke objek yang sama" untuk semua "tipe referensi selain string". Dengan demikian, ekuivalennya (asalkan tidak kelebihan beban).

Saya, secara pribadi, juga mendukung penggunaan sintaks kedua, dan merasa lebih mudah dipertahankan untuk pemeriksaan null. Saya juga berpendapat bahwa setiap kelebihan beban operator== juga harus memberikan pemeriksaan yang tepat terhadap null, dan dalam kasus di mana tidak karena alasan tertentu (yang akan aneh), kemungkinan akan ada alasan khusus di balik keputusan itu yang akan menyebabkan Anda ingin menggunakan kelebihan muatan, bukan ReferenceEquals.


29
2017-09-17 19:36



Dengan c # 7, Anda dapat menggunakan:

if ( !(myObject is null) )

Ini setara dengan

if (!ReferenceEquals(myObject, null))

12
2017-11-11 00:44



Nah, jika seseorang mengesampingkan == atau! = Operator mereka bisa membuat mereka melakukan apa pun yang mereka inginkan. Bahkan bisa melakukan hal yang nyata seperti itu return true; atau return false;. Selain itu, jika ada operator yang kelebihan beban ada kemungkinan yang layak bahwa itu tidak akan berfungsi sebaik mungkin ReferenceEquals (tidak dijamin, dan itu mungkin tidak cukup penting, tapi tetap saja).

Karena itu, karena dengan implementasi yang masuk akal dari setiap operator yang kelebihan beban ini tidak mungkin menjadi masalah sama sekali. Saya pribadi tidak menggunakannya ReferenceEquals kecuali saya punya alasan kuat untuk tidak menggunakan == operator untuk jenis itu atau dalam contoh khusus itu.


3
2017-09-17 19:38



Dalam hal pemeriksaan null, keduanya harus selalu mengembalikan hasil yang sama. Jika referensi non-null sama dengan null (bahkan ketika menggunakan pola Null Object), terlepas dari apakah ReferenceEquals atau operator == digunakan, itu adalah sangat sesuatu yang buruk. Jadi, dalam skenario itu saya akan menggunakan == /! =.

Saya akan mengatakan bahwa, jika operator == kelebihan beban, menggunakan ReferensiEquals mungkin menjadi sedikit lebih cepat. Hal pertama yang harus dilakukan oleh kelebihan muatan == adalah apakah kedua variabel mengarah ke objek yang sama, jadi dalam kasus operator yang kelebihan beban, Anda akan berakhir dengan bingkai tambahan pada tumpukan panggilan. Menggunakan ReferensiEquals juga menjamin bahwa itu adalah hanya periksa dilakukan.

Saya biasanya juga akan menggunakan == /! = Dalam hampir semua skenario lainnya. Seluruh ide adalah bahwa operator mendefinisikan "kesetaraan"; yang tidak selalu referensial (pada kenyataannya, kebanyakan benda majemuk harus dibandingkan secara struktural untuk kesetaraan; mereka sama jika anggota mereka sama). Objek, secara teoritis, tahu bagaimana cara terbaik untuk membandingkan dirinya dengan objek lain, untuk persamaan, urutan relatif, dll. Jadi daripada melakukan hardcoding yang sangat spesifik dan mungkin bagian yang salah dari logika, Anda harus menggunakan sifat bahasa yang berorientasi objek ke biarkan objek memberi tahu Anda apakah itu sama dengan yang lain atau tidak.


1
2017-09-17 19:41



Tag VB.NET mungkin seharusnya tidak disertakan dalam pertanyaan ini karena tidak disebutkan, tetapi, untuk kelengkapan, Is setara dengan Object.ReferenceEquals dan jadi selalu bisa digunakan daripada panggilan itu.


0
2017-09-18 08:24



ReferenceEquals mungkin sedikit lebih cepat. Seperti yang disebutkan sebelumnya, memastikan tidak ada operator Sama yang kelebihan beban sedang dipanggil. Juga ReferenceEquals memastikan hanya satu perbandingan yang dilakukan alih-alih kemungkinan 2 tergantung pada implementasi operator Sama yang kelebihan beban. Meskipun sangat mungkin operator yang kelebihan beban menggunakan ReferenceEquals sendiri sebagai pernyataan pertama.

Saya pribadi memang menggunakan ReferensiEquals, tetapi hanya di tempat-tempat di mana saya benar-benar mengutak-atik memeras siklus jam terakhir (tempat-tempat yang mungkin disebut jutaan kali per detik). Atau ketika saya tidak memiliki kontrol atas tipe, seperti dalam kasus generik. ... Tetapi sekali lagi hanya ketika kinerja benar-benar penting.


0
2018-02-12 15:54