Sobes.tech
Middle

Kako se vrše poređenja nizova u C#? Da li se porede reference objekata nizova?

sobes.tech АИ

Одговор од АИ

Upoređenje nizova u C# može se izvršiti na više načina:

  1. Operator ==: Za literale nizova i ako nizovi imaju isti sadržaj, operator == će vratiti true. Za razliku od drugih referentnih tipova, operator == za nizove je preopterećen da upoređuje sadržaj, a ne reference.
  2. Metod Equals(): Ovaj metod takođe poredi sadržaj nizova po defaultu. Preporučuje se za eksplicitno poređenje sadržaja i može biti pouzdaniji, posebno pri poređenju sa null. Postoje preopterećenja koja uzimaju u obzir osetljivost na velika/mala slova i kulturu.
  3. Metod String.Compare(): Statički metod koji poredi dva niza i vraća ceo broj koji ukazuje na odnos redosleda između njih. Omogućava da se navede različite parametre poređenja (osetljivost na velika/mala slova, kultura itd.).
  4. Metod String.CompareOrdinal(): Poredi nizove bajt po bajt, bez obzira na kulturne osobine.
  5. Metod String.CompareTo(): Metod instance koji poredi trenutni niz sa drugim nizom ili objektom. Slično je String.Compare(), ali se poziva na objektu niza.

Referentne reference objekata nizova se ne porede direktno operatorom == ili metodom Equals() (bez korisnički definisanog preopterećenja) u običnom poređenju sadržaja. Iako su nizovi referentni tipovi, == i Equals() su posebno preopterećeni da tačno porede sadržaj.

string str1 = "hello";
string str2 = "hello";
string str3 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });

// Poređenje sadržaja
Console.WriteLine(str1 == str2);           // true (poredi sadržaj)
Console.WriteLine(str1.Equals(str2));    // true (poredi sadržaj)
Console.WriteLine(str1 == str3);           // true (poredi sadržaj)
Console.WriteLine(str1.Equals(str3));    // true (poredi sadržaj)

// Poređenje referenci (zahteva eksplicitni kast ili korišćenje ReferenceEquals)
// U ovom slučaju, str1 i str2 mogu da ukazuju na isti objekat
// zahvaljujući internovanju nizova. str3 će verovatno biti odvojen objekat.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // može biti true ili false u zavisnosti od JIT i CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // verovatno false