string.Empty vs null. Hangisini kullanıyorsunuz?


85

Son zamanlarda iş yerindeki bir meslektaşım, string.Emptybir dize değişkeni ayarlarken kullanmamamı null, yığını kirlettiği için kullanmamı söyledi?

Yapma diyor

string myString=string.Empty; ama yap string mystring=null;

Gerçekten önemli mi? İpin bir nesne olduğunu biliyorum, bu yüzden mantıklı.

Aptalca bir soru olduğunu biliyorum ama senin görüşün nedir?


1
Her ikisini de neden yaptığından tam olarak emin değilim ... örnek olarak tartıştığınız koddan biraz daha fazlasını verebilir misiniz?
stusmith

Kod yok. Meslektaşımdan hata ayıkladığım bir şeye bakmasını istedim ve genel bir kural olarak "string.empty kullanma", yığın üzerinde giderken null olarak ayarla dedi. Kişisel olarak ben her zaman string.Empty kullandım. ortaya çıktığı zaman "" yerine kullanılacak doğru şey olması gerekiyordu.
user712923


Demek istediğim ... string.Empty, ""ve nullhepsi sabit değerler, ama hepsi yeterince 'basit' ki neden bir değişkene bir tane atadığınızı anlayamıyorum. Bir outdeğişkeni yakalamanız gerekiyorsa , neden sadece kullanmıyorsunuz string myString;?
stusmith

8
Bu günlerde, okunabilirlik ve anlambilim üzerine odaklanmayan ve saçma mikro optimizasyonlara odaklanan bu gibi konulardaki tartışmalar en iyi ihtimalle zayıf. Verdiğiniz bağlam için hangisinin doğru anlama geldiğini kullanın. (örneğin, birinin göbek adı String.Emptyolmadığını biliyorsanız , kullanırsınız ; birisinin kullandığınız ikinci adı olup olmadığını bilmiyorsanız null). Ardından, doğru anlama sahip olduğunuzda, kodu açıkça doğru ve kolay korunacak bir şekilde yazın.
jason

Yanıtlar:


111

nullve Emptyçok farklılar ve aralarında keyfi olarak geçiş yapmayı önermiyorum. Ancak hiçbirinin ekstra "maliyeti" yoktur, çünküEmpty tek bir sabit referans olduğundan (bunu istediğiniz kadar kullanabilirsiniz) .

Yığın üzerinde ldsfld'nin neden olduğu bir "kirlilik" yok - bu endişe .... çılgınca. nullA'nın yüklenmesi tartışmasız marjinaldir daha ucuzdur, ancak değeri kontrol etme konusunda dikkatli olmazsanız boş referans istisnalarına neden olabilir.

Şahsen ben ikisini de kullanmıyorum ... Kullanacağım boş bir dize istiyorsam ""- basit ve açık. Staj, bunun aynı zamanda kullanım başına ek yükü olmadığı anlamına gelir .


IL düzeyinde, "" ve Boş arasındaki fark sadece ldstr ve ldsfld'dir - ancak her ikisi de aynı tek interned dizge referansını verir. Dahası, daha yeni .NET sürümlerinde JIT bunlara doğrudan müdahale eder ve aslında statik bir alan araması yapmadan boş dize referansı verir . Temel olarak, okunabilirlik dışında, her iki şekilde de ilgilenmek için hiçbir neden yoktur. Ben sadece "" kullanıyorum.


5
@ user712923, somut endişeleriyle geri gelirse, onları duymak isterim
Marc Gravell

4
@Marc: ASAIK "" string.Empty olmayan bir nesne oluşturur .. kontrol bu ve bu . Yaylı stajyer havuzuyla bir ilgisi var ....
Jalal Said


1
""Altı kat daha uzun standart kod yerine kullanmak için +1 . Bu saçmalığı kim savundu ?! @Jalal Brad Abrams'ın gönderdiği postanın güncelliğini yitirdiği ve derleyici hala aynı şeyi yapmak için bu iki kodu optimize etmiyorsa, Microsoft'tan utan! Ama onların işini düzeltmek bizim işimiz değil. Ve aslında, buna ihtiyacımız yok: İkinci bağlantıda, Lasse (yorumlarda) her iki varyantla karşılaştırmanın montaj çıktılarını karşılaştırdı: bunlar aynı.
Konrad Rudolph

1
@Konrad: Bir örnek, sabit dizeleri birleştirirken olan şeydir: dize sınıfı intern havuzunu kullanır, bu nedenle yeni bir dize oluşturduğunuzda, sınıf dizenin havuzda olup olmadığını kontrol eder ve sonra havuza eklenmemişse. Bu nedenle, ""havuzun zaten orada olup olmadığını kontrol etmek için tüm havuzu aradığında ve bu şekilde kullanıldığında önceden tanımlanmış değeri string.Empty;kullanacak ve arama artık mevcut olmayacaktır. Sınıf da bu yöntemlerin exposeed: kontrol , bustring.Intern/IsInterned
Jalal Said,

35

'Yığını kirletmez', teknik bir neden yoktur, ancak bir nesneye bir referansa bir değişken atamak arasında büyük bir fark vardır (boş bir dize olsa bile) ve null . Aynı şey değildirler ve farklı şekillerde kullanılmaları gerekir.

nullveri olmadığını belirtmek için kullanılmalıdır string.Empty(veya"" ) verilerin varlığını, aslında bazı boş metinleri belirtmek için kullanılmalıdır. En uygun olanın ne olduğundan emin olmadığınız özel bir durum var mı?

Eklenen örnekleri düzenleyin:

  • string.EmptyBir kişinin adı için varsayılan postfix olarak kullanabilirsiniz (örneğin, çoğu insanın doktora derecesi yoktur)

  • nullYapılandırma dosyasında belirtilmeyen bir yapılandırma seçeneği için kullanabilirsiniz . Bu durumda, string.Emptyyapılandırma seçeneği mevcutsa kullanılır, ancak istenen yapılandırılmış değer boş bir dizedir.


Hiç böyle düşünmemiştim, itiraf etmeliyim Az önce söylediğin şeyden dolayı, bana bir örnek verebilir misin? Açıklamanızın açıklayıcı olduğunu biliyorum ama yine de ... teşekkürler
user712923

2
Birini veya diğerini seçmenin tek nedeni, onu kullanacağınız yere bağlıdır. Yani kullanım string.Emptyveya ""boş bir dize kullanmak istiyorsanız ve ne zaman nullsen belirtmek istediğinizde hiçbir veri yoktur. string.EmptyBir kişinin adı için (örneğin çoğu kişinin doktorası yoktur) ve nullyapılandırma dosyasında belirtilmeyen bir yapılandırma seçeneği için varsayılan sonek olarak kullanabilirsiniz . Bu ikinci durumda, string.Emptyyapılandırma seçeneği mevcutsa kullanılır, ancak istenen yapılandırılmış değer boş bir dizedir.
Kieren Johnstone

@Kieren Johnstone, eğer birinin postfix adı yoksa, neden null"postfix yok" belirtmek için kullanmayasınız ?
OfirD

8

Başkalarının zaten cevapladığı gibi farklılar.

static void Main(string[] args)
{
    string s1 = null;
    string s2 = string.Empty;
    string s3 = "";
    Console.WriteLine(s1 == s2);
    Console.WriteLine(s1 == s3);
    Console.WriteLine(s2 == s3);
}

 results:
 false     - since null is different from string.empty
 false     - since null is different from ""
 true      - since "" is same as string.empty

Boş dizge ile boş dizelerin yönetilmesiyle ilgili sorun, onu düz bir dosyada saklamanız veya iletişim yoluyla aktarmanız gerektiğinde bir sorun haline geliyor. bu özel sorun.

Dizeleri bir dosyaya veya iletişime kaydetmek amacıyla:
muhtemelen dizeyi bayta dönüştürmek isteyeceksiniz.
tavsiye ettiğim iyi bir uygulama, dönüştürülmüş dizenize 2 segment başlık baytı eklemektir.

segment 1 - 1 baytta saklanan ve bir sonraki segmentin uzunluğunu tanımlayan meta bilgi.

segment 2 - kaydedilecek dizenin uzunluğunu tutar.

örnek:
string "abcd" - basitleştirmek için ASCII kodlayıcı kullanarak dönüştüreceğim ve {65,66,67,68} elde edeceğim.
hesaplama segmenti 2, 4 değerini verir - yani 4 bayt dönüştürülen dizenin uzunluğudur.
1. segmenti hesapla, 1'i verir - dönüştürülen dize bilgisinin uzunluk bilgisini tutmak için sadece 1 bayt kullanıldığından (4'tü, yani 260 olsaydı 2 alırdım)

Yeni bayt şeridi artık bir dosyaya kaydedilebilecek {1,4,65,66,67,68} olacaktır.

Konuyla ilgili avantajı, kurtaracak boş bir dizem olsaydı, dönüşümden 0 uzunluğunda boş bir bayt dizisi elde edecektim ve segmentleri hesapladıktan sonra {1,0} elde edeceğim. kaydedilir ve daha sonra yüklenir ve boş bir dizeye geri yorumlanır. Öte yandan, dizemde boş değer olsaydı, kaydetmek için bayt dizim olarak yalnızca {0} olur ve yüklendiği zaman tekrar boş olarak yorumlanabilir.

Birden çok dizgiyi zıplarsanız hangi boyutun yükleneceğini veya biriktirileceğini bilmek gibi daha fazla fayda vardır.

Konuya geri dönersek - bu, bir null nullları boştan ayırmak için herhangi bir sistem tarafından kullanılan aynı prensipler gibi yığını kirletecektir. kirlilik deyin .. sadece 1 bayt daha.


1

Ölümüne yanıtlandı, ancak null değer yok, başlatılmamış anlamına gelir. string.Empty, MSDN'de belirtildiği gibi "" (boş bir dize) anlamına gelir.

Boş veya boş bir dizeyi kontrol etmenin en güvenli yolu string.IsNullOrEmpty kullanmaktır.


-2

FWIW, ben karıştırma bulundu ""ve String.Emptyçalışmaz:

var a = "";
alert("a " + (a == "") + ", " + (a==String.Empty));   //Yields "a true, false"

var b = String.Empty;
alert("b " + (b == "") + ", " + (b == String.Empty)); //Yields "b false, true"

Özellikle, $.trimboş bir DOM giriş alanının değerini almak için kullanırsanız , o zaman onu karşılaştırırsanız String.Empty, elde edersiniz false. Neden olduğundan emin değilim, ama buyrun. Artık ""tutarlılık için her yerde kullanıyorum .


1
Evet. Bu yüzden hepimiz kontrol etme .Length==0veya kullanma alışkanlığını sürdürmeliyiz.Compare()
zanlok

14
Bu soru c # not js ile ilgili soruyor
Cole Johnson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.