2012-03-26 184 views
0

所以要長話短說。一位教授在課堂上提出這個問題作爲討論的開始。除了明顯的A == B對B == A,有什麼區別

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

將保證沒有NPE比較時,是什麼原因使用B == A而不是A == B?

其中A和B屬於同一類型,並且這與語言無關。所以你可以假設Java的A.equals(B),或者C或C++等中的等價語法......

不,這不是家庭作業。

+2

您的每個場景和語言都有非常不同的答案。 – SLaks 2012-03-26 19:40:56

+0

使用'=='(假設它沒有超載)不會拋出C#。 – Oded 2012-03-26 19:41:01

+0

這個例子中的B是什麼? – 2012-03-26 19:41:08

回答

10

在Java中,A == BB == A總是具有相同的語義。在C#中(它有運算符重載),如果BA類的子類的實例,則可能有區別。請注意0​​不等於A == B

+0

我實際上是在尋找更多的東西,但沒有考慮到C#==有重載,但我會把子類的例子放到測試中。但那是我沒有考慮過的事情。 – Churk 2012-03-26 20:38:57

+0

@Churk - 平等測試的危害之一(與測試身份相對)是,子類可以有不同的關於平等的想法,這很容易打破交換性。有沒有好辦法解決這個問題。 – 2012-03-26 21:41:18

1

我想你的意思是.equals,而不是==。如果a爲空,則a.equals(b)將拋出NPE,但如果b爲空,則不會拋出NPE。因此,如果您知道a不爲空,則應該使用a.equals(b)而不是其他方式。

這是不是,但是,語言無關。有些語言根本沒有null!

+0

這是顯而易見的原因之一,這就是爲什麼A是initalized。 – Churk 2012-03-26 19:44:09

1

在java中,你可以做A == B或B == A,你不會得到一個NPE。真正的問題是,當你做

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

,而不是

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

既然你調用一個對象的方法,而「myString的」是一個正確的實例化對象,那麼第二個電話永遠無論變量「s」是否爲null,都拋出一個NPE。由於您不確定「s」賦值右側的「...」是否爲「yourString」或null,因此您無法在第一次調用時獲得該保證。

+0

這是確保沒有NPE的顯而易見的原因之一,但是我在尋找什麼其他原因。我已經和很多誰不能拿出來討論,而教授也沒有說。所以我很好奇,如果有的話。 – Churk 2012-03-26 19:47:59

+0

即使在你編輯的例子中,沒有NPE的風險,因爲你沒有調用可能的空引用的方法,你只是比較兩個引用,看看它們是否相同。在Java中,排序與「==」無關。 – 2012-03-26 19:52:16

0

在Java

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

所以,如果你有一個已知的恆定值,它應該是在表達的左側。

3

在C#運營商不能保證是可交換的,因爲它們可以被重載,所以A ==乙不一定會返回相同的結果爲B == A.

例如

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); 
    } 
} 

是的,我意識到這是瘋了。

相關問題