2010-03-01 15 views
12

W Javie są operatory "==" i "równa się" dla typów odniesienia i "==" dla typów wartości. dla typu odniesienia "==" oznacza, że ​​oba obiekty wskazują tę samą lokalizację, a "równe" oznacza, że ​​ich wartości są takie same. czy C# ma podobne operatory dla typu wartości i typów referencyjnych?C# == różni się w typach wartości i typach odniesienia?

Odpowiedz

15

Cóż, == może być przeciążone dla typów odniesienia. Na przykład:

string a = new string('x', 10); 
string b = new string('x', 10); 
Console.WriteLine(a == b); // True 
Console.WriteLine(Object.ReferenceEquals(a, b)); // False 

chyba że jest przeciążona, co oznacza „równość == odniesienia” aka „tożsamości” dla typów obiektów referencyjnych. (Jak mówi Marc, możesz zastąpić Equals bez przeciążania ==.)

Dla typów wartości musisz przeciążać == w przeciwnym razie kompilator C# nie pozwoli ci użyć go do porównań. .NET sam zapewni implementację Equals, która zwykle robi to, co właściwe, ale czasami powoli - w większości przypadków, jeśli napiszesz własny niestandardowy typ wartości, będziesz chciał również zaimplementować IEquatable<T> i zastąpić Equals - i całkiem możliwe, że przeciążą różne operatorów.

8

C# pozwala operatorowi == zostać przeładowany (a metoda Equals być nadpisane - chociaż == i Equals nie mieć oznaczać to samo).

Jeśli chcesz mieć na myśli "to samo wystąpienie", to najlepszą opcją jest object.ReferenceEquals (dla typów referencyjnych). Typy wartości są domyślnie równe wewnętrznym.

2

Prosto z MSDN:

Dla typów wartości predefiniowanych, operator równości (==) zwraca true jeśli wartości jego operandy są równe, false w przeciwnym wypadku. Dla typów odniesienia innych niż ciąg znaków, == zwraca wartość true, jeśli jej dwa operandy odnoszą się do tego samego obiektu . W przypadku typu łańcucha == porównuje wartości ciągów.

Jon Skeet powinien móc daje doskonałą odpowiedź chociaż: P

+0

Już cię pokonał! – leppie

+0

Tak, pokonał mnie 46 sekund! Wiedziałem, że kiedy pisałem swoją odpowiedź, Jon dostarczył bardzo dobrą odpowiedź. – Kelsey

0

To jest właśnie tak to działa z .NET, jak również. C# FAQ blog explains equals better:

równości metoda jest tylko jeden wirtualny zdefiniowane w System.Object, a przesłonięte przez którykolwiek zajęcia wybrać zrobić. Operator == jest operatorem , który może być przeciążony przez klasy , ale który zwykle ma zachowanie tożsamościowe .

Dla typów referencyjnych gdzie == nie został przeciążony, porównuje czy dwie referencje odnoszą się do tego samego obiektu - co jest właśnie realizacja równych robi w System.Object.

Powiązane problemy