Ne zaman Dize kullanmak daha iyi olur.Format vs dize birleştirme? | Netgez.com
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

  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • gsmaestro

    gsmaestro

    17 AÄžUSTOS 2006
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008