değişkenlerle string.format ve satır içi değişkenler


9

Kullanmanın artıları / eksileri (varsa) nelerdir

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

karşı

string output; 
int i = 10;
output = "the int is " + i;

Her zaman ikinci örneği kullandım, ancak çevrimiçi öğreticilerin büyük çoğunluğu string.format örneğini kullanıyor gibi görünüyor. Verimlilik açısından gerçek bir fark olduğunu düşünmüyorum, ilk düşüncem bu yüzden bir kodlayıcının değişkenleri eklemek için dizeyi kırmaya devam etmesi gerekmiyor.


8
Bunun ana nedeni, çeviriyi daha kolay hale getirmesidir, çünkü programınızın farklı dillerin cümlelerini nasıl oluşturduğunu anlamasına gerek yoktur. Örneğin, Fransızca'daki birçok ifade ve kelime öbeği, İngilizce çevirilerine kıyasla arka arkayadır.
JohnL

Yanıtlar:


22

Eğer çevirinin projenizde önemli olduğunu düşünüyorsanız, ilk sözdizimi bu konuda gerçekten yardımcı olacaktır.

Örneğin:

static final string output_en = "{0} is {1} years old.";
static final string output_fr = "{0} a {1} ans.";

int age = 10;
string name = "Henri";
System.out.println(string.Format(output_en, name, age));
System.out.println(string.Format(output_fr, name, age));

Ayrıca değişkenlerinizin cümledeki sözdizimiyle her zaman aynı yerde olmayabileceğini unutmayın:

static final string output_yoda = "{1} years {0} has.";

4
+1 nesne-konu-fiil sözdizimine örnek olarak Yoda-speak kullanmak için.
Mike Harris

1
C # ile yeni bir seçeneğimiz var:System.out.println($"{name} is {age} year's old.");
Berin Loritsch


@BerinLoritsch: maalesef yerelleştirme için tamamen kullanılamaz.
Bryan Boettcher

@BryanBoettcher, anladı, ama OP'de başarmaya çalıştıklarını söyleyen bir şey görmedim.
Berin Loritsch

8

Https://stackoverflow.com/questions/4671610/why-use-string-format için ilk cevaba göz atın . Neden daha iyi olduğuna dair her şeyi kapsıyor.

Ayrıca, her .NET derlemesinde benzersiz dizelerden oluşan bir koleksiyon içeren bir stajyer havuzu vardır. Kodunuz derlendiğinde, kodunuzda başvurduğunuz tüm dize değişmezleri bu havuza eklenir. Şuna benzeyen bir kodunuz varsa:

"the int is " + i + " and the double is " + d

Bu havuzda 2 dizeleri yapar.

Eğer varsa:

"the int is {0} and the double is {1}"

Havuzda yalnızca bir Dize var.

Dizelerin ne zaman staj yaptığını ve derleyicinin bazen staj yapılması gerekmeyecek Dizeleri tespit ederken biraz zekası olduğu için bilmek biraz daha karmaşıktır ... Örneğin, bu konu hakkında daha fazla bilgi veren bu makaleye göz atın. Önemli olmak.

Düzenleme: biraz kazma sonra, soruya ilginç bir cevap karşılaştım Ne zaman String.Format vs string bitiştirme kullanmak daha iyidir? . Kısacası, +30 oy içeren cevabın yazarı, yerelleştirme dahil olmadığında Dize birleşimi lehine zorlayıcı bir argüman yapar.


2
Bence, üslupla, benim gibi insanlarla rezonansa girer, örneğin c'den printf ve sprintf için kullanılan insanlar.
Jonathan Henson

Cevabımı düzeltmek için neden düşüşü bilmek isterdim. Teşekkürler.
Jalayn

4

Ben ilk yolu tercih çünkü bana doğru çıktı zaman dize nasıl görüneceğini görmenizi sağlar. Bir boşluk eklemeyi veya yalnızca dizeler eklerken fazladan boşluk eklemeyi unutmak çok kolaydır.

Ayrıca ekstra dizeleri oluşturmak zorunda değilsiniz nedeniyle ilk şekilde bir performans avantajı olduğundan eminim; ama bu benim birincil kaygım değil.


2

İlk seçeneği kullanarak, yaygın olarak kullanılan bir biçim dizesini saklayabilir ve gerekli yazmayı azaltabilir ve dizeyi kullanıldığı her yerde güncellemeyi kolaylaştırabilirsiniz. Temel olarak ilk seçenek DRY'nin kolayca uygulanmasına izin verir. Daha önce de belirttiğiniz gibi, bir dizede birden çok değişkenin kullanılması gerekiyorsa, çok daha iyi bir sözdizimidir.


ahh Anlıyorum, sanırım örneği düşünmemiştim: string.format ("int {0}. yine {0}", int);
Jim

1

Bence string.Format()sonucun tam olarak ne olacağını görmek daha kolay (bu yüzden unutulmuş alanlarla veya bunun gibi bir şeyle ilgili sorunlarınız yok) ve ayrıca yazmak ve değiştirmek daha kolay.

Çok basit biçimlendirme yapmak istiyorsanız, +artı operatörünü kullanmak daha kolay olabilir, ancak daha fazla değil, sadece iki dizeyi birleştirirken kullanma eğilimindeyim.

Nasıl string.Format()değiştirmenin daha kolay olduğunu göstermek için, örneğinizdeki cümlenin sonuna tam bir durak eklemek istediğinizi düşünün: - dan string.Format("The int is {0}", i)gitmek string.Format("The int is {0}.", i)sadece bir karakterdir. Ama giden "the int is " + iiçin "the int is " + i + '.'çok daha fazla.

Bir başka avantajı da string.Format(), kullanılacak biçimi kolayca belirtmenize izin vermesidir string.Format("The int is 0x{0:X}.", i). Tarih biçimlendirilirken bu daha da önemlidir.

Verimlilik gelince string.Format(), basit dize birleştirme işlemleri muhtemelen daha yavaştır. Ancak böyle bir kod büyük olasılıkla sıcak bir yolda değildir, bu yüzden önemli değil. Ve eğer öyleyse, muhtemelen kullanmaktan daha iyidir StringBuilder.


string.Format dahili olarak bir StringBuilder kullanır
Bryan Boettcher

1

Kodunuzu en okunaklı olanı kullanın. Performans konusunda endişelenmeyin.

Aşağıdaki örneğiniz için B'yi tercih ediyorum çünkü daha okunabilir. Ancak yukarıdaki dil çevirileri de mantıklı. Kimsenin sizi string kullanmaya zorlamasına izin vermeyin. Biçim yerine , Mikro Atlama Tiyatrosunun Sad Trajedisi'nde Jeff Atwoods'un mükemmel blogunu okuyun ve işaret edin

A:

string output; 
int i = 10;
output = string.Format("the int is {0}", i);

karşı

B:

string output; 
int i = 10;
output = "the int is " + i;

-1

Ref: String output: format veya concat C #?

Bu kodu düşünün.

Kodunuzun biraz değiştirilmiş bir sürümüdür.

  1. Console.WriteLine'ı ölçmeye çalıştığımdan daha az büyüklükte büyüklükte olduğu için kaldırdım.
  2. Döngüden önce Kronometreye bakıyorum ve hemen sonra durduruyorum, bu şekilde işlev örneğin 26.4 keneler çalıştırılırsa hassasiyeti kaybetmiyorum.
  3. Sonucu yineleme sayısına bölme şekliniz yanlıştı. 1000 milisaniye ve 100 milisaniyeniz varsa ne olduğunu görün. Her iki durumda da 1000000'e böldükten sonra 0 ms alırsınız.
Stopwatch s = new Stopwatch();

var p = new { FirstName = "Bill", LastName = "Gates" };

int n = 1000000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0;

string result;
s.Start();
for (var i = 0; i < n; i++)
    result = (p.FirstName + " " + p.LastName);
s.Stop();
cElapsedMilliseconds = s.ElapsedMilliseconds;
cElapsedTicks = s.ElapsedTicks;
s.Reset();
s.Start();
for (var i = 0; i < n; i++)
    result = string.Format("{0} {1}", p.FirstName, p.LastName);
s.Stop();
fElapsedMilliseconds = s.ElapsedMilliseconds;
fElapsedTicks = s.ElapsedTicks;
s.Reset();


Console.Clear();
Console.WriteLine(n.ToString()+" x result = string.Format(\"{0} {1}\", p.FirstName, p.LastName); took: " + (fElapsedMilliseconds) + "ms - " + (fElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x result = (p.FirstName + \" \" + p.LastName); took: " + (cElapsedMilliseconds) + "ms - " + (cElapsedTicks) + " ticks");
Thread.Sleep(4000);

Bunlar benim sonuçlarım:

1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 618ms - 2213706 ticks
1000000 x result = (p.FirstName + " " + p.LastName); took: 166ms - 595610 ticks

1
Bu, birinci kod örneğinin veya ikinci kod örneğinin daha iyi bir tasarım olup olmadığı yönlerine nasıl cevap verir? 1M yinelemeleri üzerinden yarım saniye, bir kişinin bakımı kolay mı yoksa bakmıyorsa nasıl hesaplanır?

Jim sordu, "Artıları ve eksileri nelerdir?" Bu, birçok yinelemede String.Format'ın daha hızlı olduğunu gösterir.
jp2code

Bunu bir kod bloğu ve OP kodundan farklı olarak bırakmak yerine cevabınıza tam olarak eklemeyi düşünmelisiniz. Haliyle, cevabınız OP'nin İngilizce sorusuna cevap vermiyor. Diğer cevaplara bak. Tüm kodu onlardan kaldırmak ve yine de OP'nin sorusuna bir cevap almak mümkün olacaktır.
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.