Porównania równości (Przewodnik programowania w języku C#)
Czasami konieczne jest porównanie dwóch wartości równości. W niektórych przypadkach testujesz równość wartości, znaną również jako równoważność, co oznacza, że wartości zawarte w dwóch zmiennych są równe. W innych przypadkach należy określić, czy dwie zmienne odwołują się do tego samego obiektu bazowego w pamięci. Ten typ równości jest nazywany równością referencji lub tożsamością. W tym temacie opisano te dwa rodzaje równości i podano linki do innych tematów, aby uzyskać więcej informacji.
Równość odwołań
Równość referencyjna oznacza, że dwa odwołania do obiektów odwołują się do tego samego obiektu bazowego. Może to nastąpić za pomocą prostego przypisania, jak pokazano w poniższym przykładzie.
using System;
class Test
{
public int Num { get; set; }
public string Str { get; set; }
public static void Main()
{
Test a = new Test() { Num = 1, Str = "Hi" };
Test b = new Test() { Num = 1, Str = "Hi" };
bool areEqual = System.Object.ReferenceEquals(a, b);
// False:
System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");
// Assign b to a.
b = a;
// Repeat calls with different results.
areEqual = System.Object.ReferenceEquals(a, b);
// True:
System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");
}
}
W tym kodzie tworzone są dwa obiekty, ale po instrukcji przypisania oba odwołania odwołują się do tego samego obiektu. W związku z tym mają one równość referencyjną. ReferenceEquals Użyj metody , aby określić, czy dwa odwołania odwołują się do tego samego obiektu.
Pojęcie równości referencyjnej dotyczy tylko typów referencyjnych. Obiekty typu wartości nie mogą mieć równości przez odniesienie, ponieważ gdy wystąpienie typu wartości jest przypisane do zmiennej, tworzona jest kopia wartości. W związku z tym nigdy nie można mieć dwóch nieboxowanych struktur odwołujących się do tej samej lokalizacji w pamięci. Ponadto, jeśli używasz ReferenceEquals do porównywania dwóch typów wartości, wynik zawsze będzie false
, nawet jeśli wartości, które są zawarte w obiektach, są identyczne. Dzieje się tak, ponieważ każda zmienna jest umieszczana w osobnym wystąpieniu obiektu. Aby uzyskać więcej informacji, zobacz sekcję Jak przetestować równość odwołań (Tożsamość).
Równość wartości
Równość wartości oznacza, że dwa obiekty zawierają tę samą wartość lub wartości. W przypadku typów wartości pierwotnych, takich jak int lub bool, testy równości wartości są proste. Możesz użyć == operatora , jak pokazano w poniższym przykładzie.
int a = GetOriginalValue();
int b = GetCurrentValue();
// Test for value equality.
if (b == a)
{
// The two integers are equal.
}
W przypadku większości innych typów testowanie równości wartości jest bardziej złożone, ponieważ wymaga zrozumienia sposobu definiowania tego typu. W przypadku klas i struktur, które mają wiele pól lub właściwości, równość wartości jest często definiowana, aby oznaczać, że wszystkie pola lub właściwości mają tę samą wartość. Na przykład dwa Point
obiekty mogą być równoważne, jeśli pointA.X jest równy pointB.X i pointA.Y jest równy pointB.Y. W przypadku rekordów równość wartości oznacza, że dwie zmienne typu rekordu są równe, jeśli typy są zgodne, a wszystkie wartości właściwości i pól są zgodne.
Nie jest jednak wymagane, aby równoważność była oparta na wszystkich polach w typie. Może on być oparty na podzestawie. Podczas porównywania typów, których nie jesteś właścicielem, należy dokładnie zrozumieć, w jaki sposób równoważność jest definiowana dla tego typu. Aby uzyskać więcej informacji na temat definiowania równości wartości we własnych klasach i strukturach, zobacz Jak zdefiniować równość wartości dla typu.
Równość wartości dla wartości zmiennoprzecinkowych
Porównania równości wartości zmiennoprzecinkowych (double i float) są problematyczne z powodu niedokładności arytmetyki zmiennoprzecinkowej na komputerach binarnych. Aby uzyskać więcej informacji, zobacz uwagi w temacie System.Double.
Tematy pokrewne
Nazwa | Opis |
---|---|
Jak przetestować równość referencji (identyczność) | Opisuje, jak określić, czy dwie zmienne mają równość referencyjną. |
Jak zdefiniować równość wartości dla typu | Opisuje sposób podawania niestandardowej definicji równości wartości dla typu. |
typy | Zawiera informacje o systemie typów języka C# i linki do dodatkowych informacji. |
rekordy | Zawiera informacje o typach rekordów, które domyślnie testują, czy wartości są równe. |