Zauważyłem, że chociaż interpolacja ciągów jest naprawdę przyjemna, gdy jest stosowana do wywołań formatu ciągu w istniejącej bazie kodu, biorąc pod uwagę ogólnie preferowany limit kolumn, ciąg szybko staje się zbyt długi dla pojedynczej linii. Zwłaszcza, gdy interpolowane wyrażenia są złożone. Dzięki łańcuchowi formatującemu masz listę zmiennych, które możesz podzielić na wiele wierszy.
var str = string.Format("some text {0} more text {1}",
obj1.property,
obj2.property);
Czy ktoś ma jakieś preferowane sposoby przełamania tych linii?
Przypuszczam, że mógłbyś zrobić coś takiego:
var str = $"some text { obj1.property }" +
" more text { obj2.property };
$""
która działa jak@""
$"some text { obj1.property }" + " more text { obj2.property }";
nie robi tego, co myślisz, że robi. Tylko pierwsza połowa tego wyrażenia jest ciągiem interpolowanym; jest następnie łączony z nieinterpolowanym literałem ciągu" more text { obj2.property }"
Odpowiedzi:
Państwo może przełamać linię do wielu linii, ale nie powiedziałbym, z ładnym wyglądem składniowe więcej.
Musisz użyć
$@
składni, aby użyć interpolowanego ciągu dosłownego i możesz umieścić znaki nowej linii wewnątrz{...}
parametrów, na przykład:string s = $@"This is all { 10 } going to be one long { DateTime.Now } line.";
Powyższy ciąg nie będzie zawierał żadnych nowych linii i faktycznie będzie miał następującą zawartość:
(uwaga, format norweski)
Powiedziawszy to, nie przestałbym używać
string.Format
. Moim zdaniem niektóre z tych wyrażeń interpolacji ciągów wyglądają naprawdę dobrze, ale bardziej złożone stają się bardzo trudne do odczytania. Biorąc pod uwagę, że jeśli nie użyjeszFormattableString
, kod i tak zostanie skompilowany w wywołanie doString.Format
, powiedziałbym, że kontynuuj tam,String.Format
gdzie ma to sens.źródło
FormattableString
sprowadza się do wezwaniaString.Format
.$@""
składnię!FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");
ponieważ łączy dwa interpolowane ciągi w jeden prosty ciąg.> 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
. Wynik to"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"
Możesz łączyć
$
i@
razem, aby uzyskać interpolację ciągów i wieloliniowy literał ciągu:var str = $@"some text { obj1.property } more text { obj2.property }";
Ale to da ci
NewLine
postać pomiędzy, więc może nie być tym, czego chcesz.źródło
$@"
z programu Visual Studio, każdy nowy wiersz należy rozpoczynać od lewej strony edytora tekstu.Podczas gdy OP poprosił o coś innego, spodziewam się, że wiele osób czytających to pytanie chciałoby interpolacji wielowierszowej,
$""
która działa jak@""
. Aby to zrobić, użyj$@""
$@"Height: {height} Width: {width} Background: {background}"
źródło
To jest to:
var str = $"some text { obj1.property }" + $" more text { obj2.property }";
Zwróć uwagę na drugą
$
w$"..." + $"..."
źródło
FormattableString
rzutowania na połączonym łańcuchu?Jako przykład użyłem StringBuilder w ramach zastąpionego ToString ().
// 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(); }
źródło
buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);
???