Saat memeriksa String ==
operator, saya perhatikan ada panggilan String.Equals(string a, string b)
, artinya hanya jalan-jalan.
Meneliti String.Equals(string a, string b)
metode ini, saya melihat bahwa ia melakukan pemeriksaan kesetaraan menggunakan ==
operator. Bagaimana ini benar-benar berfungsi dan tidak menyebabkan StackOverflowException
ketika melakukan sesuatu seperti "x" == "x"
atau "x" == "y"
?
Pembaruan : Saya memberi tahu JetBrains dan mereka menjadikannya prioritas penting untuk dotPeek. https://youtrack.jetbrains.com/issue/DOTP-6789
Saya juga menambahkan masalah pada repo GitHub ILSpy.
a == b
), tetapi benar dalam VB.NET:a Is b
.Jawaban:
Dekompiler Anda memiliki bug. Kode sebenarnya tidak memeriksa
a == b
, memeriksa(Object)a == (Object)b
, mem-bypass operator yang kelebihan beban.sumber
object.ReferenceEquals(a,b)
akan jauh lebih jelas ..object.ReferenceEquals
versi pemeran (mis., Bagaimana jikaa
itunull
?), Dan, selama Anda tahu apa itu casting, tentu saja itu tidak dikaburkan.(Object)a == (Object)b
danObject.ReferenceEquals(a, b)
hampir sama-sama dapat dibaca, tetapi tidak akan mengejutkan saya jikaObject.ReferenceEquals(a, b)
hanya memiliki sedikit peluang untuk tidak mendapatkan inline jika kedalaman inline maksimum tercapai. MS melakukan banyak optimasi mikro, karena sebagian besar loop ketat dalam kode pengguna akhirnya memanggil kode MS.Ini kode asli dari Microsoft. Operator
==
yang menerapkan s==
panggilan operatorString.Equals
yang diimplementasikan sebagai:Seperti yang Anda lihat, perbandingan untuk kesetaraan string dilakukan dengan menggunakan
if ((Object)a==(Object)b)
casting string keobject
dan kemudian melakukan perbandingan. Jadi ini tidak akan memanggil operator kelebihan beban==
di kelas string.sumber