Sobes.tech
Middle

C#'ta dizelerin karşılaştırılması nasıl yapılır? Dize nesnelerinin referansları karşılaştırılır mı?

sobes.tech yapay zeka

AI'dan gelen yanıt

C# dilinde dizelerin karşılaştırılması birkaç şekilde yapılabilir:

  1. == Operatörü: Dizgi literaleri ve eğer dizeler aynı içeriğe sahipse, == operatörü true döner. Diğer referans türlerinin aksine, dizeler için == operatörü içeriği karşılaştırmak üzere aşırı yüklenmiştir, referansları değil.
  2. Equals() Metodu: Bu metod da varsayılan olarak dizelerin içeriğini karşılaştırır. Açık içerik karşılaştırması için önerilir ve özellikle null ile karşılaştırmada daha güvenilirdir. Büyük/küçük harf duyarlılığı ve kültür dikkate alınabilir.
  3. String.Compare() Metodu: İki diziyi karşılaştıran ve sıralama ilişkisini belirten tam sayı döndüren statik bir metod. Farklı karşılaştırma parametreleri (büyük/küçük harf, kültür vb.) belirtebilir.
  4. String.CompareOrdinal() Metodu: Dizeleri bayt bayt karşılaştırır, kültürel özellikleri dikkate almaz.
  5. String.CompareTo() Metodu: Bir örnek metod olup, geçerli diziyi başka bir dizi veya nesne ile karşılaştırır. String.Compare()'ya benzer, ancak dizge nesnesi üzerinde çağrılır.

Dizelerin referansları **normal içerik karşılaştırmasında doğrudan == veya Equals() (kullanıcı tanımlı aşırı yükleme olmadan) ile karşılaştırılmaz. Dizeler referans türleri olmasına rağmen, kullanım kolaylığı için == ve Equals() özel olarak içeriği karşılaştırmak üzere aşırı yüklenmiştir.

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

// İçerik karşılaştırması
Console.WriteLine(str1 == str2);           // true (içerik karşılaştırılır)
Console.WriteLine(str1.Equals(str2));    // true (içerik karşılaştırılır)
Console.WriteLine(str1 == str3);           // true (içerik karşılaştırılır)
Console.WriteLine(str1.Equals(str3));    // true (içerik karşılaştırılır)

// Referans karşılaştırması (açık dönüşüm veya ReferenceEquals kullanımı gerekir)
// Bu durumda, str1 ve str2 aynı nesneye işaret edebilir
// stringlerin internlenmesi nedeniyle. str3 büyük olasılıkla ayrı bir nesnedir.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // true veya false olabilir, JIT ve CLR'ye bağlı
Console.WriteLine(object.ReferenceEquals(str1, str3)); // büyük olasılıkla false