Sobes.tech
Middle

როგორ ხდება სტრიქონების შედარება C#-ში? შედარებიან თუ არა სტრიქონის ობიექტების რუკები?

sobes.tech AI

პასუხი AI-სგან

C#-ში სტრიქონების შედარება შეიძლება რამდენიმე გზით:

  1. == ოპერატორი: სტრიქონული ლიტერალებისთვის და თუ სტრიქონებს აქვთ ერთნაირი შინაარსი, ოპერატორი == დააბრუნებს true. სხვა მიმთითებელ ტიპებთან შედარებით, == ოპერატორი გადატვირთულია შინაარსის შედარებისთვის, არა მიმთითებლებისთვის.
  2. Equals() მეთოდი: ეს მეთოდი ასევე შედარებს სტრიქონების შინაარსს. რეკომენდებულია მკაფიო შინაარსის შედარებისთვის და შეიძლება იყოს უფრო საიმედო, განსაკუთრებით null-თან შედარებისას. არსებობს გადატვირთვები რეგისტრის და კულტურის გათვალისწინებით.
  3. String.Compare() მეთოდი: სტატიკური მეთოდი, რომელიც შედარებს ორ სტრიქონს და აბრუნებს მთელ მნიშვნელობას, რომელიც მიუთითებს მათ შორის ურთიერთობას. საშუალებას გაძლევთ მიუთითოთ სხვადასხვა პარამეტრები (რეგისტრი, კულტურა და სხვა).
  4. String.CompareOrdinal() მეთოდი: შედარებს სტრიქონებს ბაიტზე, კულტურული სპეციფიკაციების გარეშე.
  5. String.CompareTo() მეთოდი: ინსტანციური მეთოდი, რომელიც შედარებს მიმდინარე სტრიქონს სხვა სტრიქონთან ან ობიექტთან. ანალოგია String.Compare(), მაგრამ იძახება სტრიქონის ობიექტზე.

სტრიქონების ობიექტური მიმთითებლები არ შედარება პირდაპირ == ან Equals() (მომხმარებლის მიერ გადატვირთული ვარიანტების გარეშე) ჩვეულებრივ შინაარსთან შედარებისას. მიუხედავად იმისა, რომ სტრიქონები მიმთითებლური ტიპებია, == ოპერატორი და Equals() სპეციალურად გადატვირთულია შინაარსის შედარებისთვის.

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

// შინაარსის შედარება
Console.WriteLine(str1 == str2);           // true (შინაარსი შედარებულია)
Console.WriteLine(str1.Equals(str2));    // true (შინაარსი შედარებულია)
Console.WriteLine(str1 == str3);           // true (შინაარსი შედარებულია)
Console.WriteLine(str1.Equals(str3));    // true (შინაარსი შედარებულია)

// მიმთითებლების შედარება (საჭიროა მკაფიო გადატვირთვა ან `ReferenceEquals`-ის გამოყენება)
// ამ შემთხვევაში str1 და str2 შეიძლება მიუთითებდეს ერთ ობიექტს,
// სტრიქონების ინტერნინგის გამო:
Console.WriteLine(object.ReferenceEquals(str1, str2)); // შეიძლება იყოს true ან false, დამოკიდებულია JIT და CLR-ზე
Console.WriteLine(object.ReferenceEquals(str1, str3)); // სავარაუდოდ false