SORU
3 Mart 2014, PAZARTESİ


Özel bir durum olarak string boş mu?

Jon Skeet sınav okudum ve benim ikinci örnek ilk kişi ise neden işlemediğini merak ettim.

Neden bu true verim :

object x = new string("".ToArray());
object y = new string("".ToArray());
Console.WriteLine(x == y); //true

Ama bu seferki öyle değil:

var k="k";
//string.intern(k); // doesn't help
object x = new string(k.ToArray());
object y = new string(k.ToArray());
Console.WriteLine(x == y); //false

Vs2010 ile fw 4.5 kullanıyorum.

Neyse ki ben de vs2005 yüklü , sonuç : aynı

enter image description here

CEVAP
3 Mart 2014, PAZARTESİ


Burada sorunuza cevap olan Eric Lippert tarafından bir blog yazısı: String interning and String.Empty.

Benzer bir durum tarif ediyor:

object obj = "Int32";
string str1 = "Int32";
string str2 = typeof(int).Name;
Console.WriteLine(obj == str1); // true
Console.WriteLine(str1 == str2); // true
Console.WriteLine(obj == str2); // false !?

Bu yüzden, bu staj özel tek örnek staj yaptım bile string, olacak anlamına gelmez.Sadece derleme sabitler varsayılan olarak staj yaptım. Aşağıdaki kodu doğru baskı anlamına gelir:

var k1 = "k";
object k2 = "k";
Console.WriteLine(k1 == k2);

Ama, eğer sen denemek oluşturmak string "k" içerik programlı çalışma zamanında, örneğin kullanarak string(char[]) yapıcı, arama ToString() bir nesne kullanarak StringBuilder, vb, olmaz olsun staj dize varsayılan olarak. Bu bir yanlış yazdırır;

var k1 = "k";
object k2 = new string("k".ToCharArray());
Console.WriteLine(k1 == k2);

Neden? Zamanında çünkü staj dizeleri pahalı.

Bedava Yemek diye bir Şey Yok.

(...)

Kısacası, genel durumda buna değer tüm dizeleri stajyer.

Ve boş bir dize ile farklı davranış hakkında:

Bazı sürümleri .NET çalışma zamanı otomatik olarak boş bir dize stajyer zamanında, bazı yoktur!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Motor Trend Channel

    Motor Trend

    11 Mart 2006
  • Paulo Bautista

    Paulo Bautis

    21 Aralık 2008
  • Tylerron

    Tylerron

    6 AĞUSTOS 2006