Garis interpolasi string panjang dalam C # 6


134

Saya telah menemukan bahwa sementara interpolasi string benar-benar baik ketika diterapkan pada panggilan format string basis kode saya yang sudah ada, mengingat batas kolom yang umumnya disukai, string dengan cepat menjadi terlalu panjang untuk satu baris. Terutama ketika ekspresi yang diinterpolasi kompleks. Dengan string format Anda memiliki daftar variabel yang dapat Anda bagi menjadi beberapa baris.

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

Adakah yang punya cara lebih disukai untuk memecah garis-garis ini?

Saya kira Anda bisa melakukan sesuatu seperti:

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

1
Dalam pengalaman saya, lebih baik untuk menghindari interpolasi ekspresi kompleks. Alih-alih mengekstrak variabel dalam kasus itu. Jika Anda melakukannya, dan Anda putus di mana Anda memiliki baris baru di dalam string Anda, biasanya akan cocok.
markijbema

2
Saya bingung dengan pertanyaan ini. Saya hanya ingin multiline $""yang berfungsi seperti@""
Kolonel Panic

2
Kolonel Panic, pertanyaannya adalah tentang bagaimana memecah garis interpolasi yang panjang sehingga kita tidak melanggar persyaratan lebar kolom, tanpa memasukkan umpan garis dalam string literal itu sendiri. $ @ "" bagus, tetapi setiap baris baru yang dimasukkan ke dalam string literal.
Jeremiah Gowdy

4
Bahaya: $"some text { obj1.property }" + " more text { obj2.property }";tampaknya tidak melakukan apa yang Anda pikirkan. Hanya separuh pertama dari ekspresi itu adalah string yang diinterpolasi; kemudian digabungkan dengan string literal non- interpolated" more text { obj2.property }"
bacar

1
Untuk mendukung \ t \ r \ n dalam $ @ lihat pertanyaan stackoverflow.com/questions/51991713/…
M.Hassan

Jawaban:


198

Anda dapat memecah baris menjadi beberapa baris, tetapi saya tidak akan mengatakan sintaks terlihat bagus lagi.

Anda perlu menggunakan $@sintaks untuk menggunakan string kata demi kata yang diinterpolasi , dan Anda dapat menempatkan baris baru di dalam {...}parameter, seperti ini:

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

String di atas tidak akan mengandung baris baru dan benar-benar akan memiliki konten seperti ini:

Ini semua 10 akan menjadi satu baris 01.08.2015 23.49.47 baris.

(catatan, format norwegia)

Sekarang, setelah mengatakan itu, saya tidak akan berhenti menggunakan string.Format. Menurut pendapat saya beberapa ekspresi interpolasi string ini terlihat sangat bagus, tetapi yang lebih kompleks mulai menjadi sangat sulit dibaca. Mempertimbangkan bahwa kecuali Anda menggunakan FormattableString, kode akan dikompilasi menjadi panggilan untuk String.Formattetap, saya akan mengatakan terus dengan String.Formatmana masuk akal.


Jawaban yang solid. Saya cukup yakin FormattableStringintinya String.Formatjuga.
Alex Booker

8
Jawaban ini membantu saya mengetahui bagaimana melakukan hal yang sebaliknya. Terima kasih untuk $@""sintaksnya!
Bobson

@AlexBooker Lebih kompleks dari itu. Anda tidak dapat melakukannya FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");karena menggabungkan dua string yang diinterpolasi menjadi satu string sederhana.
ANeves

Baris baru dan tab dihormati dalam string kata demi kata yang diinterpolasi. Masukkan yang berikut ke dalam jendela interaktif C # dan string yang dihasilkan akan diformat :. > 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. Outputnya adalah"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 Saya pikir Anda melebih-lebihkan dukungan format di komentar, tapi saya mengerti dan setuju dengan apa yang Anda katakan.
Lasse V. Karlsen

61

Anda dapat menggabungkan $dan @bersama - sama untuk mendapatkan interpolasi string dan string multi-line literal:

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

Tapi itu akan memberi Anda NewLinekarakter di antaranya, jadi itu mungkin bukan yang Anda inginkan.


3
Tapi bukankah @ benar-benar memasukkan baris ke literal?
Jeremiah Gowdy

5
Itu benar. Memperbarui jawaban saya untuk secara eksplisit mengatakan itu.
MarcinJuraszek

Tidak hanya baris baru tetapi juga tab awal dari baris baru. Untuk menggambarkan dengan benar format string yang sebenarnya ketika menggunakan $@"di studio visual Anda harus memulai setiap baris baru dari ujung kiri editor teks.
GDS

Dengan solusi ini Anda tidak dapat menggunakan mis. \ R dan \ n dalam string
Johan Franzén

22

Sementara OP meminta sesuatu yang lain, saya berharap banyak orang yang membaca pertanyaan ini ingin multiline interpolasi $""yang berfungsi seperti itu @"". Untuk melakukannya, gunakan$@""

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

3
Dia tidak ingin baris baru dalam output, hanya kode itu sendiri untuk membungkus pada baris yang berbeda
Martin Capodici

7
Dia menjelaskan bahwa jawaban ini ditujukan untuk audiens yang datang mencari bagaimana melakukan string multiline menggunakan sintaksis interpolasi string.
Brandon Bonds

2

Ini dia:

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

Perhatikan yang kedua $di$"..." + $"..."


18
Perhatikan bahwa ini akan membuat dua panggilan ke String.Format dan juga membuat tiga string dalam memori (Sisi A, Sisi B, dan A + B)
Kevin Kalitowski

1
Bukankah ini akan mencegah Anda menggunakan FormattableStringgips pada string bersambung?
binki

4
Dalam banyak implementasi saat ini, berjalan pada CPU GHz dengan memori Gb, panggilan ekstra dan string tambahan tidak akan memberi Anda masalah kinerja. Masalah kinerja akan disebabkan oleh misalnya menggunakan algoritma O (n2). Saya pikir tidak adil untuk menurunkan orang ini.
Johan Franzén

1

Saya telah menggunakan StringBuilder di dalam ToString () yang diganti sebagai contoh.

    // 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();
    }

lalu mengapa tidak buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.