0Pricing
C# Academy · Lektion

Record-ähnliche Typen und wertbasierte Gleichheit (Muster)

Implementieren Sie wertbasierte Gleichheit wie bei Records: Überschreiben Sie Equals/GetHashCode, implementieren Sie IEquatable , fügen Sie ==/!=-Operatoren hinzu und halten Sie die Typen unveränderlich.

Record-ähnliche Typen und wertbasierte Gleichheit (Muster) ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 3. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.

Überblick über record-ähnliche Typen

Ziel: Lassen Sie Objekte in C# 6 anhand ihres Werts vergleichen (record-ähnlich).

  • Unveränderliche Daten
  • Equals und GetHashCode überschreiben
  • IEquatable<T> implementieren
  • Optional: ==/!= definieren

Problem der Referenzgleichheit

Klassen werden standardmäßig anhand ihrer Referenz verglichen. Zwei Objekte mit denselben Daten sind nicht gleich.

using System;

public class PersonRef
{
  public string First;
  public string Last;
}

public class Program
{
  public static void Main(string[] args)
  {
    PersonRef a = new PersonRef { First = "Ada", Last = "Lovelace" };
    PersonRef b = new PersonRef { First = "Ada", Last = "Lovelace" };

    Console.WriteLine("Reference Equals? " + object.ReferenceEquals(a, b)); // false
    Console.WriteLine("== (default)? " + (a == b)); // false (same as ReferenceEquals for classes)
  }
}

Muster für record-ähnliche Klassen

Machen Sie die Klasse unveränderlich und implementieren Sie IEquatable<T>, Equals, GetHashCode und ==/!=, damit die Gleichheit von den Daten abhängt.

using System;

// Immutable, value-based equality
public sealed class Person : IEquatable<Person>
{
  public string First { get; private set; }
  public string Last  { get; private set; }

  public Person(string first, string last)
  {
    if (string.IsNullOrEmpty(first)) throw new ArgumentException("first");
    if (string.IsNullOrEmpty(last))  throw new ArgumentException("last");
    First = first; Last = last;
  }

  // "With" helper for copy-on-change
  public Person WithFirst(string first) { return new Person(first, Last); }
  public Person WithLast(string last)   { return new Person(First, last); }

  public bool Equals(Person other)
  {
    if (object.ReferenceEquals(other, null)) return false;
    if (object.ReferenceEquals(this, other)) return true;
    return string.Equals(First, other.First) && string.Equals(Last, other.Last);
  }

  public override bool Equals(object obj)
  {
    return Equals(obj as Person);
  }

  public override int GetHashCode()
  {
    unchecked
    {
      int h = 17;
      h = h * 31 + (First == null ? 0 : First.GetHashCode());
      h = h * 31 + (Last  == null ? 0 : Last.GetHashCode());
      return h;
    }
  }

  public static bool operator ==(Person a, Person b)
  {
    if (object.ReferenceEquals(a, b)) return true;
    if ((object)a == null || (object)b == null) return false;
    return a.Equals(b);
  }

  public static bool operator !=(Person a, Person b) { return !(a == b); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Person p1 = new Person("Ada", "Lovelace");
    Person p2 = new Person("Ada", "Lovelace");
    Console.WriteLine("Value Equals? " + (p1 == p2)); // true
    Person p3 = p1.WithLast("King");
    Console.WriteLine("After With: " + (p1 == p3));   // false
  }
}

Muster für Struct-Gleichheit

Structs werden standardmäßig über ihre Felder mithilfe von ValueType.Equals verglichen. Die Implementierung von IEquatable<T> macht jedoch die Absicht und das Hashing klar.

using System;

public struct Point2 : IEquatable<Point2>
{
  public int X;
  public int Y;

  public Point2(int x, int y) { X = x; Y = y; }

  public bool Equals(Point2 other)
  {
    return X == other.X && Y == other.Y;
  }

  public override bool Equals(object obj)
  {
    if (!(obj is Point2)) return false;
    return Equals((Point2)obj);
  }

  public override int GetHashCode()
  {
    unchecked { return (X * 397) ^ Y; }
  }

  public static bool operator ==(Point2 a, Point2 b) { return a.Equals(b); }
  public static bool operator !=(Point2 a, Point2 b) { return !a.Equals(b); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Point2 a = new Point2(1, 2);
    Point2 b = new Point2(1, 2);
    Console.WriteLine("Struct value equality: " + (a == b)); // true
  }
}

Wertobjekte als Schlüssel

Wenn ein Wertobjekt ein Dictionary-Schlüssel ist, sorgen korrekte Implementierungen von Equals/GetHashCode dafür, dass Suchvorgänge erfolgreich sind.

using System;
using System.Collections.Generic;

public sealed class Email : IEquatable<Email>
{
  public string Address { get; private set; }
  public Email(string address)
  {
    if (string.IsNullOrEmpty(address)) throw new ArgumentException("address");
    Address = address.Trim().ToLowerInvariant();
  }

  public bool Equals(Email other)
  {
    if (object.ReferenceEquals(other, null)) return false;
    return Address == other.Address;
  }

  public override bool Equals(object obj) { return Equals(obj as Email); }

  public override int GetHashCode()
  {
    return Address == null ? 0 : Address.GetHashCode();
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Dictionary<Email, string> owners = new Dictionary<Email, string>();
    owners[new Email("User@Mail.com")] = "Ada";
    Console.WriteLine(owners.ContainsKey(new Email("user@mail.com"))); // true
  }
}

Checkliste für Gleichheit

Checkliste:

  • Halten Sie Daten unveränderlich.
  • Überschreiben Sie Equals und GetHashCode.
  • Implementieren Sie IEquatable<T> für typsichere und schnelle Vergleiche.
  • Fügen Sie ==/!= für mehr Komfort hinzu.
  • Verwenden Sie für Gleichheit und Hashing konsistente Felder.

Anforderung an record-ähnliche Gleichheit

Kurze Verständnisfrage: Was müssen Sie tun, damit sich eine Klasse in C# 6 wie ein Wert (record-ähnlich) verhält?

Zusammenfassung

Zusammenfassung: In C# 6 erstellen Sie record-ähnliche Typen von Hand: unveränderliche Daten, IEquatable<T>, korrekte Implementierungen von Equals/GetHashCode und optional ==/!=. Verwenden Sie sie sicher in Mengen und Dictionaries.

Häufig gestellte Fragen

Ist die Lektion „Record-ähnliche Typen und wertbasierte Gleichheit (Muster)“ kostenlos?

Ja — der vollständige Text von „Record-ähnliche Typen und wertbasierte Gleichheit (Muster)“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 3 Lektionen.

Was lerne ich in „Record-ähnliche Typen und wertbasierte Gleichheit (Muster)“?

Implementieren Sie wertbasierte Gleichheit wie bei Records: Überschreiben Sie Equals/GetHashCode, implementieren Sie IEquatable , fügen Sie ==/!=-Operatoren hinzu und halten Sie die Typen unveränderl… Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 3.

Wie lange dauert die Lektion „Record-ähnliche Typen und wertbasierte Gleichheit (Muster)“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Structs: Wertsemantik und Muster für Unveränderlichkeit
  2. Record-ähnliche Typen und wertbasierte Gleichheit (Muster)
  3. Enums und [Flags]
← Zurück zu C# Academy