SORU
17 Kasım 2008, PAZARTESİ


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
18 Kasım 2008, Salı


İ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.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Carlos Delgado

    Carlos Delga

    21 HAZİRAN 2011
  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007
  • monkophile

    monkophile

    25 Temmuz 2007