String Interpolation vs String.Format


114

Dize enterpolasyonunu kullanma arasında dikkate değer bir performans farkı var mı:

myString += $"{x:x2}";

vs String.Format ()?

myString += String.Format("{0:x2}", x);

Ben sadece soruyorum çünkü Resharper düzeltmeyi teşvik ediyor ve daha önce kandırıldım.


4
Neden ikisini de deneyip farkı fark edip edemeyeceğinizi görmüyorsunuz?
Blorgbeard

57
@Blorgbeard Dürüst olmak gerekirse, tembelim. Ve siz saygın erkek / kadınlardan birinin cevabı elden öğrenmesinin daha az zaman alacağını düşündüm.
Krythic

26
Bu soruyu ilk sorduğumda unutulmaya oy verildiğini ve şimdi, iki yıl sonra +21'e kadar çıkmasını seviyorum.
Krythic

47
Ciddi anlamda. Bu sorunun yararlılığından nasıl şüphe duyulabilir? Bu soruyu soran herkesin 'kendi başına denemek ve görmek' zorunda kalması durumunda , toplam çalışma saatinin boşa harcanacağını hayal edebiliyor musunuz? Yalnızca 5 dakika sürse bile, bunu şimdiye kadar bu soruyu görüntüleyen 10.000'den fazla geliştiriciyle çarpın. Ve sonra bir iş arkadaşınız sonuçlarınızdan şüphe ettiğinde ne yaparsınız? Hepsini yeniden yap? Ya da belki onları bu SO gönderisine yönlendirin. Bunun için orada olduğu kesin.
BTownTKD

8
@BTownTKD Bu, sizin için tipik bir Stackoverflow davranışıdır. Herhangi biri siteyi amacına uygun olarak kullanırsa, derhal yabancılaştırılır. Bu aynı zamanda hesapları toplu olarak yasaklamamıza izin verilmesinin nedenlerinden biri. Pek çok insan bu sitede olmayı hak etmiyor.
Krythic

Yanıtlar:


72

Dikkate değer görecelidir. Ancak: dize enterpolasyonu string.Format()derleme sırasında dönüştürülür , bu nedenle aynı sonuca ulaşmaları gerekir.

Yine de ince farklılıklar vardır: Bu sorudan anlayabileceğimiz gibi , biçim belirleyicideki dize birleştirme ek bir string.Concat()çağrı ile sonuçlanır .


4
Aslında, dizgi enterpolasyonu bazı durumlarda (örneğin a intkullanıldığında) dizge birleştirme şeklinde derlenebilir . var a = "hello"; var b = $"{a} world";dize birleştirme için derler. var a = "hello"; var b = $"{a} world {1}";dize biçiminde derler.
Omar Muscatello

5

dize enterpolasyonu, derleme zamanında string.Format () 'a dönüştürülür.

Ayrıca string.Format'ta tek bağımsız değişken için birkaç çıktı ve tek bağımsız değişken için farklı çıktı biçimleri belirtebilirsiniz. Ancak dize enterpolasyonu sanırım daha okunabilir. Yani, size kalmış.

a = string.Format("Due date is {0:M/d/yy} at {0:h:mm}", someComplexObject.someObject.someProperty);

b = $"Due date is {someComplexObject.someObject.someProperty:M/d/yy} at {someComplexObject.someObject.someProperty:h:mm}";

Bazı performans testi sonuçları var https://koukia.ca/string-interpolation-vs-string-format-string-concat-and-string-builder-performance-benchmarks-c1dad38032a


2
dize enterpolasyonu bazen dönüştürülür String::Format. ve bazen içine String::Concat. Ve bu sayfadaki performans testi gerçekten anlamlı değil: bu yöntemlerin her birine aktardığınız argümanların miktarı bağlıdır. concat her zaman en hızlı değildir, stringbuilder her zaman en yavaş değildir.
Matthias Burger

3

Soru performansla ilgiliydi, ancak başlık sadece "vs" diyor, bu yüzden birkaç nokta daha eklemem gerektiğini hissediyorum, yine de bazıları fikirli.

  • yerelleştirme

    • Satır içi kod yapısı nedeniyle dize enterpolasyonu yerelleştirilemez. Yerelleştirmeden önce haline getirildi string.Format. Bununla birlikte, bunun için araçlar var (örneğin ReSharper).
  • Sürdürülebilirlik (bence)

    • string.Formatgüzel ve anlamlı bir hata mesajı oluştururken, ifade etmek istediğim cümleye odaklandığı için çok daha okunaklı . Yer {N}tutucuları kullanmak bana daha fazla esneklik sağlıyor ve daha sonra değiştirmek daha kolay.
    • Ayrıca, yorumlamadaki satır içi biçim tanımlayıcısının yanlış okunması ve bir değişiklik sırasında ifadeyle birlikte silinmesi kolaydır.
    • Karmaşık ve uzun ifadeler kullanıldığında, enterpolasyonun okunması ve sürdürülmesi hızla daha da zorlaşır, bu nedenle bu anlamda kod gelişirken ve daha karmaşık hale geldiğinde iyi ölçeklenmez. string.Formatbuna çok daha az eğilimlidir.
    • Günün sonunda tüm kaygıları ayrılığı dair: Ben karıştırmamaya sevmiyorum o nasıl sunacağınız ile sunulmalıdır neler .

Bu yüzden bunlara dayanarak kodumun string.Formatçoğuna bağlı kalmaya karar verdim . Ancak daha akıcı bir kodlama yöntemine sahip olmak için daha çok sevdiğim bir uzatma yöntemi hazırladım . Uzantının uygulaması tek astarlıdır ve kullanımda basitçe böyle görünür.

var myErrorMessage = "Value must be less than {0:0.00} for field {1}".FormatWith(maximum, fieldName);

Enterpolasyon harika bir özellik, beni yanlış anlamayın. Ancak IMO string.Format, JavaScript gibi benzer özelliği kaçıran dillerde en iyi şekilde parlıyor .


Buna eklediğiniz için teşekkür ederiz.
Krythic

1
Sürdürülebilirlik konusunda aynı fikirde değilim; ReSharper, eklenen değerleri karşılık gelen indekslerle eşleştirmeyi biraz daha kolaylaştırır (ve bunun tersi de geçerlidir) ancak {3}özellikle formatınızı yeniden düzenlemeye başlarsanız X veya Y olup olmadığını anlamanın daha fazla bilişsel yük olduğunu düşünüyorum . Madlibs örneği: $"It was a {adjective} day in {month} when I {didSomething}"vs string.Format("It was a {0} day in {1} when I {2}", adjective, month, didSomething)-> $"I {didSomething} on a {adjective} {month} day"vsstring.Format("I {2} on a {0} {1} day", adjective, month, didSomething)
drzaus

@drzaus Düşüncelerinizi paylaştığınız için teşekkürler. İyi noktalara sahipsiniz, ancak yalnızca basit, iyi adlandırılmış yerel değişkenler kullanırsak bu doğrudur. Pek çok kez gördüğüm şey karmaşık ifadeler, işlev çağrıları, enterpolasyonlu dizgeye ne konulmuşsa. İle string.FormatBence sen çok daha az eğilimli bu konuya bulunmaktadır. Her neyse, bu yüzden benim fikrim olduğunu vurguladım :)
Zoltán Tamási
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.