2012-03-26 27 views
0

Also, um eine lange Geschichte kurz zu machen. Ein Professor stellte diese Frage im Unterricht als Diskussionsstarter. Neben dem offensichtlichenA == B vs B == A, Was sind die Unterschiede

B = new SomeClass("B"); // But B can be null, can can be new SomeClass("A"); 
A = new SomeClass("A"); 
A==B 

wird garantiert keine NPE beim Vergleich, was sind die Gründe, B == A statt A == B zu verwenden?

Wo A und B vom selben Typ sind, und dies ist sprachunabhängig. So können Sie annehmen, A.Equals (B) für Java oder gleichwertige Syntax in C oder C++ usw. ....

Und nein, das ist keine Hausaufgaben.

+2

Jedes Ihrer Szenarien und Sprachen hat eine ganz andere Antwort. – SLaks

+0

Verwenden von '==' (vorausgesetzt, es wurde nicht überlastet) wird nicht C# werfen. – Oded

+0

Was ist 'B' in diesem Beispiel? –

Antwort

10

In Java haben A == B und B == A immer die gleiche Semantik. In C# (mit Operatorüberladung) kann es einen Unterschied geben, wenn beispielsweise B eine Instanz einer Unterklasse der Klasse A ist.

Hinweis: A.equals(B) entspricht nicht A == B.

+0

Ich war eigentlich auf der Suche nach etwas mehr, aber habe nicht berücksichtigt, dass C# == überladen hat, aber ich werde das Unterklasse-Beispiel auf den Prüfstand stellen. Aber das habe ich nicht berücksichtigt. – Churk

+0

@Churk - Eine der Gefahren der Gleichheitsprüfung (im Gegensatz zur Identitätsüberprüfung) besteht darin, dass Unterklassen unterschiedliche Vorstellungen über Gleichheit haben können, und dies kann die Kommutativität leicht brechen. Dafür gibt es keine guten Wege. –

1

Ich denke, du meinst .equals, nicht ==. a.equals(b) wird eine NPE werfen, wenn a null ist, aber nicht, wenn b null ist. Wenn Sie also wissen, a ist nicht null, sollten Sie a.equals(b) statt umgekehrt tun.

Dies ist nicht, jedoch sprachunabhängig. Einige Sprachen haben überhaupt keine Null!

+0

Das ist einer der offensichtlichen Gründe, weshalb A initialisiert wird. – Churk

1

In Java können Sie A == B oder B == A ausführen und Sie erhalten keine NPE. Das eigentliche Problem ist, wenn Sie

String s = ...; 
boolean isNull = s.equals("myString"); 

statt

boolean isNull = "myString".equals(s); 

tun Da Sie eine Methode für ein Objekt anrufen, und „myString“ ist ein richtig instanzierte Objekt, dann der zweite Anruf wird nie Werfen Sie eine NPE, unabhängig davon, ob die Variable "s" null ist oder nicht. Diese Garantie erhalten Sie beim ersten Aufruf nicht, da Sie nicht sicher sind, ob das "..." auf der rechten Seite der "s" -Zuweisung "yourString" oder null ist.

+0

Dies ist einer der offensichtlichen Gründe, um keine NPE sicherzustellen, aber aus welchem ​​anderen Grund ich auch suche. Und ich habe mit vielen gesprochen, die sich keine vorstellen können, und der Professor erzählt es nicht. Ich bin also sehr gespannt, ob es da ist. – Churk

+0

Selbst in Ihrem bearbeiteten Beispiel besteht kein Risiko einer NPE, da Sie keine Methode für eine mögliche Nullreferenz aufrufen. Sie vergleichen lediglich zwei Referenzen miteinander, um zu sehen, ob sie identisch sind. In Java spielt die Reihenfolge keine Rolle mit "==". –

0

In Java

Object a = new Object(); 
Object b = null; 
System.out.println(a.equals(b)); //false 
System.out.println(b.equals(a)); //NPE! 

Also, wenn Sie einen bekannten konstanten Wert haben sollte es auf der linken Seite des Ausdrucks sein.

3

In C# Operatoren nicht kommutativ sein garantiert, da sie überlastet werden kann, so A == B wird das gleiche Ergebnis wie B == A. nicht unbedingt zurückkehren

Z.B.

class Program 
    { 
     static void Main(string[] args) 
     { 
     var a = new MyClass("A"); 
     var b = new MyClass("B"); 

     Console.WriteLine(a == b); 
     Console.WriteLine(b == a); 

     Console.ReadLine(); 
    } 


    public class MyClass 
    { 

    private string _Name; 

    public MyClass(string name) 
    { 
     if (_FirstInstance == null) 
     { 
      _FirstInstance = this; 
     } 
     this._Name = name; 
    } 

    private static MyClass _FirstInstance = null; 

    public static bool operator ==(MyClass left, MyClass right) 
    { 
     return object.ReferenceEquals(left, _FirstInstance); 
    } 

    public static bool operator !=(MyClass left, MyClass right) 
    { 
     return !(left == right); 
    } 
} 

Ja, ich weiß, das ist verrückt.

Verwandte Themen