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 triedeobject. Predvolene porovnáva referencie, ale môže byť prepísaná na porovnanie podľa hodnoty. - Rozhranie
IComparablea 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.