Sobes.tech
Junior — Middle

Je možné vykonať koncepčné hodnotenie a porovnanie akýchkoľvek objektov v jazyku C#?

sobes.tech AI

Odpoveď od AI

V jazyku C# je koncepčne možné porovnávať akýkoľvek objekt, avšak spôsob a zmysel porovnania závisí od typu objektov a implementovaných rozhraní.

Na porovnávanie objektov sa zvyčajne používajú:

  • Metóda Equals(object obj) — definovaná v základnej triede object. Predvolene porovnáva referencie, ale môže byť prepísaná na porovnanie podľa hodnoty.
  • Rozhranie IComparable a generické IComparable<T> — umožňujú určiť poradie medzi objektmi (napríklad pre zoradenie).
  • Operátory == a != — môžu byť prepísané pre vlastné typy.

Ak objekty neimplementujú žiadne porovnanie, porovnanie bude na základe referencií (t.j. sú rovné iba ak ukazujú na ten istý objekt).

Príklad implementácie porovnania podľa hodnoty:

class Person : IEquatable<Person>, IComparable<Person>
{
    public string Name { get; set; }
    public int Age { get; set; }

    public bool Equals(Person other) => other != null && Name == other.Name && Age == other.Age;

    public override bool Equals(object obj) => Equals(obj as Person);

    public override int GetHashCode() => HashCode.Combine(Name, Age);

    public int CompareTo(Person other)
    {
        if (other == null) return 1;
        int nameComparison = string.Compare(Name, other.Name, StringComparison.Ordinal);
        if (nameComparison != 0) return nameComparison;
        return Age.CompareTo(other.Age);
    }
}

Týmto je možné koncepčne porovnávať, avšak pre správne a zmysluplné porovnanie musia objekty implementovať príslušné metódy alebo rozhrania.