none
String.Empty - "" - Null arasındaki fark nedir?

    Soru

  • Merhaba arkadaşlar,

    programcılıkta biraz yeniyim aklıma takılan birşey var String.Empty ile "" arasındaki fark nedir,

    String a = String.Empty;

    String a = null;

    String a = "";

    aynı işi yapan şeyler olmamalı diye düşündüm.

    15 Şubat 2011 Salı 08:51

Yanıtlar

Tüm Yanıtlar

  • Merhaba,

    Her ne kadar String.Empty ve "" ile aynı boş string değerini elde etsenizde, aralarındaki temel fark:

    String.Empty ile aslında bellekte herhangi bir nesne yaratmayıp sadece String altındaki Empty alanına (field) a referans vermektedir.

    Sting a = ""; ile boş değerli (empty) yeni bir string nesnesi bellekte "yaratılmış" olmaktadır. (String a = "blabla" gibi.)

    http://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and

    String a = null'da yine String.Empty gibi uzunluğu "sıfır" olan bir stringi represent etmekte olup kendisine "null" değeri atanmış olup, henüz kendisinin refere ettiği bir string örneklemi bulunmadığını belirtmektedir. Hatta .NET Framework bu iki durumu aynı method ile geliştiricilerin kontrol edebilmesi için String.IsNullOrEmpty methodunu barındırmaktadır.

    İyi çalışmalar,


    Best regards, Saygılarımla, Onur Güzel

    Yazgeliştir Forumları'ndayım.

    Microsoft Haber Grupları Profilim (VB.NET)

    • Yanıt Olarak İşaretleyen Phantom Opera 16 Şubat 2011 Çarşamba 06:41
    15 Şubat 2011 Salı 09:08
    Moderatör
  • Merhaba,

        .Net 2.0 sürümüne kadar "" kullanımı hafızada yeni bir alan ayırmaktaydı; aynı sıfırdan bir değişken tanımlanmış gibi. Buna karşın String.Empty ise her zaman için aynı nesneye referans göstermekteydi, dolayısıyla yeni bir hafıza alanı ayrılmamaktaydı.

        Bu durum .net 2.0 ve üstü framework sürümlerinde değişmiş durumdadır. .Net 2.0 ve üzeri bir framework sürümünde geliştirdiğiniz uygulamalarda JITing sonrasında her iki kullanımda heap'te aynı alana işaret edeceklerdir . Dolayısıyla iki kullanım arasında pratikte hiç bir fark olmayacaktır.

     

      Konu hakkında c# spec'lerinde "2.4.4.5 String literals" başlığı altında aşağıdaki şekilde not düşülmüştür;

    Each string literal does not necessarily result in a new string instance. When two or more string literals that are equivalent according to the string equality operator (§ 7.9.7 ) appear in the same program, these string literals refer to the same string instance. For instance, the output produced by

    class Test
    {
    	static void Main() {
    		object a = "hello";
    		object b = "hello";
    		System.Console.WriteLine(a == b);
    	}
    }
    

    is True because the two literals refer to the same string instance.


    Fatih Boy

    Visual C# MVP

    http://www.enterprisecoding.com

    http://twitter.com/fatihboy

    16 Şubat 2011 Çarşamba 08:38
  • Peki GarbageCollector açısından bir farklılık varmıdır, string.Empty nin GC tarafından toplandığı, "" stringin ise toplanamadığı bilgisi doğrumudur?
    while(true)
      Console.WriteLine("AmonRa");
    
    www.club-bravo.com
    16 Şubat 2011 Çarşamba 09:13
    Moderatör
  • Merhaba,

        .Net 2.0 sürümüne kadar "" kullanımı hafızada yeni bir alan ayırmaktaydı; aynı sıfırdan bir değişken tanımlanmış gibi. Buna karşın String.Empty ise her zaman için aynı nesneye referans göstermekteydi, dolayısıyla yeni bir hafıza alanı ayrılmamaktaydı.

        Bu durum .net 2.0 ve üstü framework sürümlerinde değişmiş durumdadır. .Net 2.0 ve üzeri bir framework sürümünde geliştirdiğiniz uygulamalarda JITing sonrasında her iki kullanımda heap'te aynı alana işaret edeceklerdir . Dolayısıyla iki kullanım arasında pratikte hiç bir fark olmayacaktır.

     

      Konu hakkında c# spec'lerinde "2.4.4.5 String literals" başlığı altında aşağıdaki şekilde not düşülmüştür;

    Each string literal does not necessarily result in a new string instance. When two or more string literals that are equivalent according to the string equality operator (§ 7.9.7 ) appear in the same program, these string literals refer to the same string instance. For instance, the output produced by

    class Test
    {
    	static void Main() {
    		object a = "hello";
    		object b = "hello";
    		System.Console.WriteLine(a == b);
    	}
    }
    

    is True because the two literals refer to the same string instance.


    Fatih Boy

    Visual C# MVP

    http://www.enterprisecoding.com

    http://twitter.com/fatihboy

    Bu durum çalışma zamanındaki string nesneleri için seçime bağlıdır. String.Intern() 'nin açıkça kullanılması gerekir.

    string a = "merhaba";
    string b = "merhaba";
    string c = Console.ReadLine();
    Console.WriteLine("a == b : {0}", object.ReferenceEquals(a,b));
    Console.WriteLine("b == c : {0}", object.ReferenceEquals(b,c));
    c=  string.Intern(c);
    Console.WriteLine("b == c : {0}", object.ReferenceEquals(b,c));

    örneğinde konsola "merhaba" yazdığımızda sonuç :

    a == b : True
    b == c : False
    b == c : True

    olacaktır


    22 Haziran 2012 Cuma 09:48