C # 6'da uzun dize enterpolasyon satırları


134

Genel olarak tercih edilen sütun sınırı göz önüne alındığında, mevcut kod tabanımın dize Biçimi çağrılarına uygulandığında dize enterpolasyonunun gerçekten güzel olmasına rağmen, dizenin tek bir satır için hızla çok uzun hale geldiğini buldum. Özellikle enterpolasyonlu ifadeler karmaşık olduğunda. Biçim dizesi ile, birden çok satıra bölebileceğiniz bir değişkenler listesine sahip olursunuz.

var str = string.Format("some text {0} more text {1}",
    obj1.property,
    obj2.property);

Bu satırları ayırmak için tercih edilen herhangi bir yolu olan var mı?

Sanırım şöyle bir şey yapabilirsiniz:

var str = $"some text { obj1.property }" +
  " more text { obj2.property };

1
Deneyimlerime göre, karmaşık ifadelerin enterpolasyonundan kaçınmak daha iyidir. Bunun yerine, bu durumda bir değişken çıkartın. Bunu yaparsanız ve dizelerinizin içinde yeni satırların olduğu yerde ayrılırsanız, genellikle iyi uyacaktır.
markijbema

2
Bu soru kafam karıştı. Sadece $""şu şekilde çalışan bir çoklu @""
Albay Panic

2
Albay Panic, soru, uzun enterpolasyon satırlarının nasıl bölüneceği sorusudur, böylece sütun genişliği gereksinimlerini, dizginin kendisine satır beslemeleri eklemeden ihlal etmeyiz. $ @ "" harikadır, ancak buna dahil edilen her satırsonu dizge içinde olacaktır.
Jeremiah Gowdy

4
Tehlike: $"some text { obj1.property }" + " more text { obj2.property }";Yaptığını düşündüğünüz şeyi yapmaz. Bu ifadenin yalnızca ilk yarısı enterpolasyonlu bir dizedir; o zaman ile birleştirilmiş olmayan -interpolated dize" more text { obj2.property }"
Bacar

1
$ @'
Da

Yanıtlar:


198

Sen edebilirsiniz birden fazla satır konusunda çizgiyi kırmak, ama artık sözdizimi görünüyor otel personeli hakkında olacaktır.

$@Enterpolasyonlu bir harfi harfine dizeyi kullanmak için sözdizimini kullanmanız gerekir ve aşağıdaki {...}gibi parametrelerin içine yeni satırlar yerleştirebilirsiniz :

string s = $@"This is all {
    10
    } going to be one long {
    DateTime.Now
    } line.";

Yukarıdaki dize herhangi bir satırsonu içermeyecek ve aslında şu gibi içeriğe sahip olacaktır:

Bu 10'un tamamı tek bir uzun 01.08.2015 23.49.47 satır olacak.

(not, Norveç biçimi)

Şimdi, bunu söylemiştim, kullanmayı bırakmayacağım string.Format. Kanımca bu dizgi enterpolasyon ifadelerinden bazıları gerçekten iyi görünüyor, ancak daha karmaşık olanları okumak çok zor olmaya başlıyor. Kullanmadığınız sürece FormattableString, kodun String.Formatyine de bir çağrıya derleneceğini göz önünde bulundurarak String.Format, mantıklı olduğu yere devam et derim .


Sağlam cevap. Ben çok emin değilim FormattableStringbir çağrı aşağı kaynar String.Formatde.
Alex Booker

8
Bu cevap, bunun tam tersini nasıl yapacağımı anlamama yardımcı oldu. $@""Sözdizimi için teşekkürler !
Bobson

@AlexBooker Bundan daha karmaşık. Sen yapamaz FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");tek bir basit dizesine iki interpole dizeleri birleştirir çünkü.
2019

Yeni satırlar ve sekmeler, enterpolasyonlu harfi harfine dizelerde dikkate alınır. Aşağıdakini etkileşimli C # penceresine girin ve elde edilen dize biçimlendirilecektir :. > var name = "Simon"; var templateName = "How to interpolate a verbatim string"; var now = DateTime.UtcNow;. var output = $@"Hi {name}, This template is a demo of {templateName}. It was ran at {now.ToString("o")}"; > output. Çıktı"Hi Simon,\r\nThis template is a demo of How to interpolate a verbatim string.\r\n\r\nIt was ran at 2020-01-24T15:49:35.6678353Z"
Enzoaeneas

1
@Enzoaeneas Yorumlarda biçimlendirme desteğini abarttığını düşünüyorum, ancak söylediklerinizi anlıyorum ve katılıyorum.
Lasse V.Karlsen

61

Dize enterpolasyonu ve çok satırlı dize değişmezi elde etmek için birleştirebilir $ve birleştirebilirsiniz @:

var str = $@"some text { obj1.property }
     more text { obj2.property }";

Ama bu size arada bir NewLinekarakter verecektir , bu yüzden istediğiniz şey olmayabilir.


3
Ama @ aslında satır beslemesini değişmez hale getirmiyor mu?
Jeremiah Gowdy

5
Olur. Bunu açıkça söylemek için cevabımı güncelledim.
MarcinJuraszek

Sadece yeni bir satır değil, aynı zamanda yeni satırın ilk sekmeleri. $@"Visual Studio'da kullanırken gerçek dize formatını doğru bir şekilde tasvir etmek için, her yeni satıra metin düzenleyicinin en solundan başlamanız gerekir.
GDS

Bu çözümle dizede eg \ r ve \ n kullanamazsınız
Johan Franzén

22

OP başka bir şey sorarken, bu soruyu okuyan pek çok kişinin benzer $""şekilde çalışan bir çok satırlı enterpolasyonlu olmasını ister @"". Bunu yapmak için kullanın$@""

$@"Height: {height}
Width: {width}
Background: {background}"

3
Çıktıda yeni satırlar istemiyor, sadece kodun farklı satırlara sarılmasını
istiyor

7
Bu cevabın, dize enterpolasyon sözdizimini kullanarak çok satırlı dizelerin nasıl yapılacağını araştırmaya gelen izleyiciler için tasarlandığını açıkça belirtti.
Brandon Bağlar

2

Budur:

var str = $"some text { obj1.property }" +
          $" more text { obj2.property }";

İkinciye dikkat $edin$"..." + $"..."


18
Bunun String.Format'a iki çağrı yapacağını ve ayrıca bellekte üç dize oluşturacağını unutmayın (A Tarafı, B Tarafı ve A + B)
Kevin Kalitowski

1
Bu FormattableString, birleştirilmiş dize üzerinde bir tür kullanmanıza engel olmaz mı?
binki

4
Günümüzde birçok uygulamada, Gb hafızası olan bir GHz CPU üzerinde çalışmak, fazladan bir çağrı ve ek bir dizge size performans sorunları vermeyecektir. Performans sorunlarına örneğin bir O (n2) algoritması kullanılması neden olacaktır. Bu adama olumsuz oy vermenin haksızlık olduğunu düşünüyorum.
Johan Franzén

1

Örnek olarak geçersiz kılınan ToString () içinde StringBuilder kullandım.

    // return employee data
    public override string ToString()
    {
        StringBuilder buffer = new StringBuilder();
        buffer.AppendLine($"Number: {EmployeeNumber}");
        buffer.AppendLine($"Name: {EmployeeName}");
        buffer.AppendLine($"Address: {PostalAddress}");
        buffer.AppendLine($"Phone: {PhoneNumber}");
        buffer.AppendLine($"Age: {EmployeeAge}");
        buffer.AppendLine($"Gender: {EmployeeGender}");
        buffer.AppendLine($"Status: {EmployeeStatus}");
        buffer.AppendLine($"Manager: {EmployeeManager}");
        buffer.AppendLine($"Start: {EmployeeStartDate.ToShortDateString()}");
        return buffer.ToString();
    }

o zaman neden olmasın buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
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.