Ich habe zwei Objekte in C # und weiß nicht, ob es sich um einen Booleschen oder einen anderen Typ handelt. Wenn ich jedoch versuche, diese C # zu vergleichen, kann ich nicht die richtige Antwort geben. Ich habe den gleichen Code mit VB.NET ausprobiert und das hat es geschafft!
Kann mir jemand sagen, wie ich das beheben kann, wenn es eine Lösung gibt?
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
quelle
quelle
a.Equals(b)
?a
Sie Boxen und erstellen eine Box mittrue
. Wenn Sie zuweisen, erhaltenb
Sie eine weitere Box, die ebenfalls enthälttrue
. Wenn Sie vergleichena
undb
, da beide vom Typ Kompilierungszeit sindobject
, rufen Sie die Überladung auf,operator ==(object, object)
die in der C # -Sprachenspezifikation definiert ist. Diese Überladung prüft, ob die Referenzen auf dasselbe Objekt verweisen. Da Sie zwei Felder haben, ist das Ergebnisfalse
und die Anweisung "unter"if
wird nicht ausgeführt. Um dies besser zu verstehen, versuchen Sie, die Zuordnung folgendermaßen zu ändernb
:object b = a;
Jetzt haben Sie nur noch eine Box.Antworten:
In C # führt der
==
Operator (wenn er auf Referenztypausdrücke angewendet wird) eine Referenzgleichheitsprüfung durch, sofern diese nicht überladen ist . Sie vergleichen zwei Referenzen, die das Ergebnis von Box-Conversions sind. Dies sind also unterschiedliche Referenzen.BEARBEITEN: Bei Typen, die das überladen
==
, können Sie ein anderes Verhalten erzielen - dies basiert jedoch auf dem Typ der Ausdrücke zur Kompilierungszeit . Zum Beispielstring
bietet==(string, string
):Hier verwendet der erste Vergleich den überladenen Operator, der zweite den "Standard" -Referenzvergleich.
In VB
=
erledigt der Bediener viel mehr Arbeit - dies ist nicht einmal gleichbedeutend mit der Verwendungobject.Equals(x, y)
, da Dinge wie derOption Compare
Vergleich von Text Einfluss haben können.Im Grunde die Betreiber nicht funktionieren auf die gleiche Weise und sind nicht beabsichtigt , auf die gleiche Weise.
quelle
=
die Funktionsweise von VB liefern zu können , aber die Spezifikation ist nicht besonders klar.bool == bool
Vergleich durchführen.Zusätzlich zu Jons Antwort, die die C # -Seite der Dinge erklärt, macht VB Folgendes:
In VB mit prüft
Option Strict On
ein Vergleich über=
immer auf Wertgleichheit und niemals auf Referenzgleichheit. Tatsächlich wird Ihr Code nach dem Wechsel nicht einmal kompiliert,Option Strict On
da erSystem.Object
keinen definiertOperator=
. Sie sollten diese Option immer aktiviert haben, da sie Fehler effektiver abfängt als eine Venusfliegenfalle (obwohl in Ihrem speziellen Fall dieses nachlässige Verhalten tatsächlich das Richtige tut). 1Tatsächlich
Option Strict On
verhält sich VB mit noch strenger als C #: In C # wirda == b
entweder ein Aufruf von ausgelöstSomeType.operator==(a, b)
oder, falls dies nicht vorhanden ist, ein Vergleich der Referenzgleichheit aufgerufen (was dem Aufruf entsprichtobject.ReferenceEquals(a, b)
).In VB hingegen ruft der Vergleich
a = b
immer den Gleichheitsoperator auf. 2 Wenn Sie den Referenzgleichheitsvergleich verwenden möchten, müssen Sie verwendena Is b
(was wiederum dasselbe ist wieObject.ReferenceEquals(a, b)
).1) Hier ist ein guter Hinweis darauf, warum die Verwendung
Option Strict Off
eine schlechte Idee ist: Ich habe VB.NET fast ein Jahrzehnt lang verwendet, von vor der offiziellen Veröffentlichung von .NET bis vor einigen Jahren, und ich habe absolut keine Ahnung, was damit zua = b
tun istOption Strict Off
. Es macht eine Art Gleichheitsvergleich, aber was genau passiert und warum, keine Ahnung. Es ist jedoch komplexer als die Funktion von C #dynamic
(da dies auf einer gut dokumentierten API beruht). Folgendes sagt der MSDN:2) Jon hat eine Ausnahme erwähnt, Strings, bei denen der Gleichheitsvergleich aus Gründen der Abwärtskompatibilität einige weitere Dinge bewirkt.
quelle
Option Strict On
muss als Straftat angesehen werden ...Objektinstanzen werden nicht mit dem Operator "==" verglichen. Sie sollten die Methode "equals" verwenden. Mit dem Operator "==" werden Referenzen verglichen, keine Objekte.
Versuche dies:
Ergebnisse:
Versuchen Sie Folgendes:
Ergebnisse:
quelle
operator ==
. Wenn Sie diesen Operator überschreiben und nicht gleich sind, wird Ihre Ausgabe umgekehrt. Es ist nichts inhärent, Referenzen zu vergleichen,operator ==
und nichts inhärent, Werte in zu vergleichenEquals
. Sie sind nur zwei Möglichkeiten, die Gleichheit zu bestimmen. Beide haben Standardimplementierungen eines Referenzvergleichs, und beide können überschrieben werden, um das zu tun, was Sie möchten. Der einzige andere Unterschied ist, dassEquals
es virtuell ist undoperator ==
nicht.==
- Sie können es nur überladen .Das Problem ist, dass der Operator == in C # ein Aufruf einer statischen Methode ist (naja, vielleicht nicht technisch, aber es kann auch so sein), basierend auf dem Typ der Kompilierungszeit der beiden Parameter. Was die tatsächlichen Laufzeitarten dieser Objekte sind, spielt keine Rolle.
Basierend auf diesem Kompilierungszeittyp bestimmt der Compiler, welche Implementierung
operator ==
verwendet werden soll. Es kann die Standardimplementierung verwendenobject
, es kann eine der numerischen Überladungen verwenden, die von der Sprache bereitgestellt werden, oder es kann eine benutzerdefinierte Implementierung sein.Dies unterscheidet sich von VB darin, dass VB die Implementierung zur Kompilierungszeit nicht bestimmt. Es wartet bis zur Laufzeit und überprüft die beiden angegebenen Parameter, um festzustellen, welche Implementierung des
==
Operators verwendet werden soll.Ihr Code enthält boolesche Werte, diese befinden sich jedoch in Variablen vom Typ
object
. Da die Variable vom Typ istobject
, verwendet der C # -Compiler dieobject
Implementierung von==
, die die Referenzen vergleicht , nicht die Objektinstanzen. Da es sich bei den Booleschen Werten um Kästchen handelt, haben sie nicht dieselbe Referenz, obwohl ihre Werte identisch sind.Dem VB-Code ist es egal, welcher Typ die Variable ist. Es wartet bis zur Laufzeit und überprüft dann die beiden Variablen, um festzustellen, ob sie es sind tatsächlich vom Typ Boolean sind, und verwendet daher die
==
Implementierung des Booleschen Operators. Diese Implementierung vergleicht die Werte der Booleschen Werte und nicht ihre Referenzen (und die Booleschen Werte werden vor dem Aufruf dieses Operators entpackt, sodass ein Referenzvergleich nicht einmal mehr Sinn macht). Da die Werte der Booleschen Werte identisch sind, wird true zurückgegeben.quelle
=
in VB zu sagen ist.=
zusammen mit allen anderen relationalen Vergleichsoperator wie<
,>=
usw. werden speziell behandelt, wenn sich beide oder beide Seiten des Bedieners befindenObject
. Diese spezielle Behandlung wird durchgeführt, damit VB6-Programmierer, die es gewohnt sind, einenVariant
in pre-.NET VB bekannten Typ zu verwenden,Object
VB.Net auf die zuvor verwendete Weise verwenden könnenVariant
.Option Strict On
, ist VB darauf ausgerichtet, ein=
zu entpacken,Object
bis es zu einem String oder einer Zahl kommen kann.