Saya memiliki dua objek di C # dan tidak tahu apakah itu Boolean atau tipe lainnya. Namun ketika saya mencoba membandingkan C # gagal memberikan jawaban yang benar. Saya telah mencoba kode yang sama dengan VB.NET dan berhasil!
Adakah yang bisa memberitahu saya cara memperbaikinya jika ada solusi?
C #:
object a = true;
object b = true;
object c = false;
if (a == b) c = true;
MessageBox.Show(c.ToString()); //Outputs False !!
VB.NET:
Dim a As Object = True
Dim b As Object = True
Dim c As Object = False
If (a = b) Then c = True
MessageBox.Show(c.ToString()) '// Outputs True
c#
.net
vb.net
comparison
Mohsen Sarkar
sumber
sumber
a.Equals(b)
?a
Anda mendapatkan tinju dan membuat sebuah kotak yang berisitrue
. Ketika Anda menetapkan untukb
Anda dapatkan kotak lain juga mengandungtrue
. Ketika Anda membandingkana
danb
, karena keduanya bertipe waktu kompilasiobject
, Anda memanggil kelebihan yangoperator ==(object, object)
ditentukan oleh Spesifikasi Bahasa C #. Kelebihan ini memeriksa untuk melihat apakah referensi pergi ke objek yang sama. Karena Anda memiliki dua kotak, hasilnya adalahfalse
, dan pernyataan "di bawah" Andaif
tidak akan berjalan. Untuk memahami ini lebih baik, cobalah untuk mengubah penugasanb
untuk ini:object b = a;
Sekarang Anda hanya memiliki satu kotak.Jawaban:
Dalam C #,
==
operator (ketika diterapkan pada ekspresi tipe referensi) melakukan pemeriksaan kesetaraan referensi kecuali itu kelebihan beban . Anda membandingkan dua referensi yang merupakan hasil konversi tinju, jadi itu adalah referensi yang berbeda.Suntingan: Dengan tipe yang overload
==
, Anda bisa mendapatkan perilaku yang berbeda - tapi itu didasarkan pada tipe waktu kompilasi dari ekspresi. Misalnya,string
berikan==(string, string
):Di sini perbandingan pertama menggunakan operator kelebihan beban, tetapi yang kedua menggunakan perbandingan referensi "default".
Dalam VB,
=
operator melakukan lebih banyak pekerjaan - bahkan tidak setara dengan menggunakanobject.Equals(x, y)
, karena hal-hal sepertiOption Compare
dapat mempengaruhi bagaimana teks dibandingkan.Pada dasarnya operator tidak bekerja dengan cara yang sama dan tidak dimaksudkan untuk bekerja dengan cara yang sama.
sumber
=
dilakukan di VB, tetapi speknya tidak terlalu jelas.bool == bool
perbandingan.Selain jawaban Jon yang menjelaskan sisi C #, inilah yang dilakukan VB:
Dalam VB dengan
Option Strict On
, perbandingan melalui=
selalu menguji kesetaraan nilai dan tidak pernah untuk kesetaraan referensi. Bahkan, kode Anda bahkan tidak dapat dikompilasi setelah Anda beralihOption Strict On
karenaSystem.Object
tidak mendefinisikanOperator=
. Anda harus selalu memiliki opsi ini, itu menangkap bug lebih efektif daripada penangkap lalat venus (meskipun dalam kasus khusus Anda perilaku longgar ini benar-benar melakukan hal yang benar). 1Bahkan, dengan
Option Strict On
, VB berperilaku lebih ketat daripada C #: Dalam C #,a == b
baik memicu panggilan keSomeType.operator==(a, b)
atau, jika ini tidak ada, meminta referensi perbandingan kesetaraan (yang setara dengan panggilanobject.ReferenceEquals(a, b)
).Di VB di sisi lain, perbandingan
a = b
selalu memanggil operator kesetaraan. 2 Jika Anda ingin menggunakan perbandingan kesetaraan referensi, Anda harus menggunakana Is b
(yang, sekali lagi, sama denganObject.ReferenceEquals(a, b)
).1) Berikut ini indikasi bagus mengapa menggunakan
Option Strict Off
adalah ide yang buruk: Saya sudah VB.NET digunakan selama hampir satu dekade, dari sebelum rilis resmi NET sampai beberapa tahun yang lalu, dan saya sudah benar-benar tidak tahu apa yanga = b
dilakukannya denganOption Strict Off
. Ia melakukan semacam perbandingan kesetaraan, tetapi apa yang sebenarnya terjadi dan mengapa, tidak tahu. Ini lebih kompleks daripada fitur C #dynamic
, (karena itu bergantung pada API yang terdokumentasi dengan baik). Inilah yang dikatakan MSDN:2) Jon telah menyebutkan satu pengecualian, string, di mana perbandingan kesetaraan melakukan beberapa hal lagi untuk alasan kompatibilitas mundur.
sumber
Option Strict On
harus dianggap sebagai tindak pidana ...Instans objek tidak dibandingkan dengan operator "==". Anda harus menggunakan metode "sama dengan". Dengan "==" operator membandingkan referensi, bukan objek.
Coba ini:
Hasil:
Sekarang, coba ini:
Hasil:
sumber
operator ==
. Jika Anda mengesampingkan operator itu dan tidak sama maka output Anda akan terbalik. Tidak ada yang melekat untuk membandingkan referensi tentangoperator ==
dan tidak ada yang melekat tentang membandingkan nilai dalamEquals
. Mereka hanyalah dua cara untuk menentukan kesetaraan; keduanya memiliki implementasi standar dari perbandingan referensi, dan keduanya dapat diganti untuk melakukan apa pun yang Anda inginkan. Satu-satunya perbedaan lainnya adalah ituEquals
virtual, danoperator ==
tidak.==
- Anda hanya dapat membebaninya .Masalahnya adalah bahwa operator == di C # adalah panggilan ke metode statis (well, mungkin tidak secara teknis, tetapi bisa juga seperti itu) berdasarkan jenis waktu kompilasi dari dua parameter. Apa tipe runtime aktual dari objek-objek itu tidak penting.
Berdasarkan tipe waktu kompilasi itu kompiler akan menentukan implementasi apa yang
operator ==
akan digunakan. Mungkin menggunakan defaultobject
implementasi , mungkin menggunakan salah satu kelebihan numerik yang disediakan oleh bahasa, atau bisa juga implementasi yang ditentukan pengguna.Ini berbeda dari VB karena VB tidak menentukan implementasi pada waktu kompilasi. Ia menunggu sampai runtime dan memeriksa dua parameter yang diberikan untuk menentukan implementasi
==
operator yang harus digunakan.Kode Anda mengandung nilai boolean, tetapi mereka berada dalam variabel yang bertipe
object
. Karena variabel bertipeobject
, kompiler C # menggunakanobject
implementasi==
, yang membandingkan referensi , bukan instance objek. Karena nilai boolean adalah kotak, mereka tidak memiliki referensi yang sama, meskipun nilainya sama.Kode VB tidak peduli apa jenis variabelnya. Itu menunggu sampai runtime dan kemudian memeriksa dua variabel, melihat bahwa mereka sebenarnya dari kedua jenis boolean, dan menggunakan
==
implementasi operator boolean . Implementasi itu membandingkan nilai-nilai boolean, bukan referensi mereka (dan boolean akan dibuka kotaknya sebelum memanggil panggilan operator itu, sehingga perbandingan referensi bahkan tidak masuk akal lagi). Karena nilai-nilai boolean sama, itu mengembalikan nilai true.sumber
=
dikatakan dalam VB.=
, bersama dengan semua operator relasional yang lain perbandingan seperti<
,>=
, dll , diberikan perlakuan khusus ketika kedua atau kedua sisi operatorObject
. Perlakuan khusus ini dilakukan agar pemrogram VB6, yang terbiasa menggunakan tipe yang dikenal sebagaiVariant
pre-.NET VB, dapat memanfaatkanObject
VB.Net dengan cara yang telah mereka gunakanVariant
sebelumnya.Option Strict On
, VB=
bias menuju unboxingObject
sampai itu bisa sampai ke String atau numerik.