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
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.
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.
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
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.
Kiedy należy używać == i kiedy należy używać równań?
http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx
- 1. Równość w typach referencji
- 2. nieoczekiwane zachowanie w typach
- 3. CreateDelegate przy nieznanych typach
- 4. nowicjusz Haskell o typach
- 5. Niestabilność mieszania w kompozytowych typach Julii
- 6. Zasięg Emmy w typach Enum
- 7. Jak zainstalować ekspres w typach?
- 8. Cechy w algebraicznych typach danych
- 9. Literały Idris Nat w typach
- 10. Ponowne użycie wartości wyliczeniowych w oddzielnych typach wyliczeniowych
- 11. Wywołanie procedury składowanej o typach danych XML
- 12. Zalety ścisłych pól w typach danych
- 13. Mylić o niestandardowych typach danych w Haskell
- 14. Tworzenie usługi sieciowej o złożonych typach
- 15. podkreślenie zawiera (_.contains) na typach obiektów
- 16. Jak wysłać multimetr na typach pierwotnych?
- 17. Wnioskowanie typu Java o niższych ograniczonych typach
- 18. Dlaczego nie można używać składni konstruktora w typach "unsigned int"?
- 19. W jaki sposób metody obiektów toString(), ==, equals() działają inaczej lub podobnie w typach referencyjnych i pierwotnych?
- 20. Wskaźnik procedury Fortran do podprogramów w typach pochodnych
- 21. Ustawianie właściwości obiektu za pomocą odbicia o różnych typach właściwości
- 22. Czy należy unikać typów zagnieżdżonych w typach ogólnych?
- 23. Wymagane właściwości w opcjonalnych złożonych typach obiektów Entity Framework
- 24. Błędy rejestracji jednostek na typach, których nie rozwiązuję.
- 25. Najważniejsze odniesienia do wartości stałych i wartości
- 26. Zapobieganie emitowaniu przez xmlSerializer xsi: wpisz na typach odziedziczonych
- 27. Czy operacje bitowe na podpisanych typach całek są dobrze zdefiniowane?
- 28. Dlaczego python nie może wnioskować o typach takich jak scala?
- 29. Automatyczne uruchamianie Vima we wszystkich typach plików Z WYJĄTKIEM
- 30. Czy repr i str są zawsze identyczne na typach wbudowanych w Pythony?
Już cię pokonał! – leppie
Tak, pokonał mnie 46 sekund! Wiedziałem, że kiedy pisałem swoją odpowiedź, Jon dostarczył bardzo dobrą odpowiedź. – Kelsey