String.Empty - "" - Null arasındaki fark nedir?
-
15 Şubat 2011 Salı 08:51
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.
Tüm Yanıtlar
-
15 Şubat 2011 Salı 09:08Moderatör
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
-
16 Şubat 2011 Çarşamba 08:38
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
- Yanıt Olarak Öneren Emre GunerturkModerator 16 Şubat 2011 Çarşamba 08:41
-
16 Şubat 2011 Çarşamba 09:13ModeratörPeki 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 -
22 Haziran 2012 Cuma 09:48
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
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 : Trueolacaktır
- Düzenleyen Cihan Yakar 22 Haziran 2012 Cuma 09:49