Ne zaman Dize kullanmak daha iyi olur.Format vs dize birleÅŸtirme?
Dizin değeri Excel hücre içine bir giriş belirlemek için ayrıştırma kod küçük bir parça var. Beni düşünmeye sevk etti
Arasında ne fark var
xlsSheet.Write("C" rowIndex.ToString(), null, title);
ve
xlsSheet.Write(string.Format("C{0}", rowIndex), null, title);
"" Daha baÅŸka? daha iyi bir Ve neden?
CEVAP
İlk tercihim (C kökenli geliyor) Dize için.Biçimi. Daha sonra aşağıdaki nedenlerle bu düşürdüm:
- Dize birleştirme tartışmasız"". daha güvenli Benim başıma geldi (ve birkaç diğer geliştiricilere gördüm) bir parametre kaldırın ya da yanlışlıkla parametre düzeni bozmak için. Derleyici değil kontrol parametreleri karşı biçim dizesi ve sonu olan bir çalışma zamanı hatası (Yani, eğer sen şanslı değil bu anlaşılması zor bir yöntem gibi günlük bir hata). Birleştirme ile, bir parametre çıkarma daha az hata eğilimli. Hata yapma ihtimali çok azdır, ama bunu iddia edebilirsinolabilirolur.
- Dize birleÅŸtirme null deÄŸerleri String.Format
gelmez sağlar. Yazı "s1 null s2
" kırılma yok, sadece Dize null değeri davranır.Boş. Bu belirli bir senaryoya bağlı olabilir - sessizce boş bir Ad görmezden gelmek yerine bir hata istersin durumlar vardır. Ancak bu durumda bile ben şahsen boşluk için kendimi kontrol ediyorum ve özel hatalar atma Dize aldığım standart ArgumentNullException yerine tercih ederim.Biçimi.
- Dize birleştirme daha iyi yapar. Bazı mesajlar yukarıda zaten bu (bana bu yazı yazmak için kararlı, bu yüzden aslında açıklama olmadan:) söz.
Fikir .NET derleyici bu kod parçası dönüştürmek için yeterince akıllı
public static string Test(string s1, int i2, int i3, int i4,
string s5, string s6, float f7, float f8)
{
return s1 " " i2 i3 i4 " ddd " s5 s6 f7 f8;
}
bunun için:
public static string Test(string s1, int i2, int i3, int i4,
string s5, string s6, float f7, float f8)
{
return string.Concat(new object[] { s1, " ", i2, i3, i4,
" ddd ", s5, s6, f7, f8 });
}
String başlık altında ne olur.Herhangi bir parametre kolay tahmin (Reflektör). Dizideki nesneler Olabilirdi aracılığıyla dizeye dönüştürülür(). O zaman toplam uzunluğu hesaplanır ve tek bir dize (toplam uzunluğu ile ayrılmış. Son olarak, her dizesi kod bazı güvenli olmayan parça wstrcpy yoluyla elde edilen dize kopyalanır.
String.Concat
yol daha hızlı sebep? İyi, String.Format
ne - kod miktarını biçim dizesi işlemek için gerekli şaşıracaksınız bakın. Bunun üzerine (yorum bellek tüketimi konusunda gördüm), String.Format
bir StringBuilder DAHİLİ olarak kullanır. İşte nasıl:
StringBuilder builder = new StringBuilder(format.Length (args.Length * 8));
Geçirilen her argüman için, 8 karakter ayırır. Eğer bağımsız bir basamaklı bir değer ise, o zaman çok kötü, bazı israf alanı var. Eğer bağımsız özel bir nesne ToString()
, biraz uzun bir metin döndüren hatta bazı tahsisi gerekli (en kötü senaryo tabii) olabilir.
Buna göre, birleştirme sadece nesne dizisi alanı (referanslar bir dizi değil çok fazla dikkate alarak) atıklar. Biçim belirteçleri için ayrıştırma ve ara StringBuilder yok. Boks/kutulama yükü her iki yöntem mevcut.
Dize için gitmek istiyorum tek nedeni.Format yerelleştirme söz konusu olduğunda. Koyarak biçim dizeleri kaynakları sağlar sana destek farklı dil olmadan karıştırmaya kodu (düşün senaryolar nerede biçimlendirilmiş değerleri değiştirmek amacıyla bağlı olarak dil, yani "sonra {0} saat, {1} dakika" olabilir bak çok farklı Japon :).
(Ve çok uzun) benim ilk yazı özetle:
- (idame okunabilirlik/vs performans açısından) benim için dize birleştirme kullanarak en iyi,
ToString()
herhangi bir çağrı olmadan - eğer performanstan sonra iseniz,
ToString()
kendini boks (doğru okunabilirlik ön yargılıyım biraz) - Sorunuzun ilk seçenek olarak aynı önlemek için çağırır - eğer kullanıcı için yerelleştirilmiş dizeleri (burada değil) gösteren iseniz,
String.Format()
bir kenarı vardır.
Format hh ile zaman dize JavaScript sa...
Dize kullanmak için iyi bir egzersizdi...
Neden dize birleştirme dizi daha katıl...
Olabilirdi vs Dize birleÅŸtirme StringB...
JSON Dize ikili Veri. Bir ÅŸey Base64 d...