Các dòng nội suy chuỗi dài trong C # 6


134

Tôi đã thấy rằng trong khi phép nội suy chuỗi thực sự tốt khi được áp dụng cho các lệnh gọi Định dạng chuỗi của cơ sở mã hiện tại của tôi, với giới hạn cột được ưu tiên chung, chuỗi nhanh chóng trở nên quá dài cho một dòng. Đặc biệt là khi các biểu thức được nội suy là phức tạp. Với một chuỗi định dạng, bạn có một danh sách các biến mà bạn có thể chia thành nhiều dòng.

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

Có ai có bất kỳ phương tiện ưa thích để phá vỡ những dòng này?

Tôi cho rằng bạn có thể làm một cái gì đó như:

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

1
Theo kinh nghiệm của tôi, tốt hơn hết là tránh nội suy các biểu thức phức tạp. Thay vì trích xuất một biến trong trường hợp đó. Nếu bạn làm điều đó và bạn chia tay ở nơi bạn có dòng mới bên trong chuỗi của mình, nó thường sẽ phù hợp.
markijbema

2
Tôi bối rối trước câu hỏi này. Tôi chỉ muốn một multiline $""hoạt động như@""
Đại tá Panic

2
Đại tá Panic, câu hỏi đặt ra là làm thế nào để phá vỡ các dòng nội suy dài để chúng tôi không vi phạm các yêu cầu về độ rộng cột, mà không đưa ra các dòng trên chính chuỗi ký tự. $ @ "" là tuyệt vời nhưng bất kỳ dòng mới nào được đưa vào đó sẽ có trong chuỗi ký tự.
Jeremiah Gowdy

4
Nguy hiểm: $"some text { obj1.property }" + " more text { obj2.property }";không làm những gì bạn nghĩ. Chỉ nửa đầu của biểu thức đó là một chuỗi nội suy; sau đó nó được nối với chuỗi ký tự không bị xen kẽ" more text { obj2.property }"
bacar

1
Để hỗ trợ \ t \ r \ n trong $ @, hãy xem stackoverflow.com/questions/51991713/NH
M.Hassan

Câu trả lời:


198

Bạn có thể chia dòng thành nhiều dòng, nhưng tôi sẽ không nói cú pháp trông đẹp nữa.

Bạn cần sử dụng $@cú pháp để sử dụng một chuỗi nguyên văn nội suy và bạn có thể đặt các dòng mới bên trong các {...}tham số, như sau:

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

Chuỗi ở trên sẽ không chứa bất kỳ dòng mới nào và thực sự sẽ có nội dung như thế này:

Đây là tất cả 10 sẽ là một dòng dài 01,08.2015 23,49,47.

(lưu ý, định dạng tiếng Na Uy)

Bây giờ, đã nói rằng, tôi sẽ không ngừng sử dụng string.Format. Theo tôi, một số biểu thức nội suy chuỗi này trông thực sự tốt, nhưng các biểu thức phức tạp hơn bắt đầu trở nên rất khó đọc. Xem xét rằng trừ khi bạn sử dụng FormattableString, mã sẽ được biên dịch thành một cuộc gọi đến String.Formatdù sao, tôi sẽ nói hãy tiếp tục với String.Formatnơi có ý nghĩa.


Câu trả lời chắc chắn. Tôi khá chắc chắn FormattableStringsôi lên với một cuộc gọi đến String.Formatquá.
Alex Booker

8
Câu trả lời này đã giúp tôi tìm ra cách làm ngược lại chính xác điều này. Cảm ơn $@""cú pháp!
Bobson

@AlexBooker Nó phức tạp hơn thế. Bạn không thể làm FormattableString.Invarian($"Hello {name}" + \n "are you the owner of {pet}?");vì nó hợp nhất hai chuỗi nội suy thành một chuỗi đơn giản.
ANeves

Dòng mới và tab được tôn trọng trong chuỗi nguyên văn nội suy. Nhập thông tin sau vào cửa sổ tương tác C # và chuỗi kết quả sẽ được định dạng :. > 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. Đầu ra là"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 Tôi nghĩ bạn đã đánh giá cao sự hỗ trợ định dạng trong các bình luận, nhưng tôi hiểu và đồng ý với những gì bạn đang nói.
Lasse V. Karlsen

61

Bạn có thể kết hợp $@cùng nhau để có được phép nội suy chuỗi và chuỗi nhiều dòng bằng chữ:

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

Nhưng điều đó sẽ cho bạn một NewLinenhân vật ở giữa, vì vậy nó có thể không phải là điều bạn muốn.


3
Nhưng không thực sự @ đưa nguồn cấp dữ liệu vào nghĩa đen?
Jeremiah Gowdy

5
Nó làm. Cập nhật câu trả lời của tôi để nói rõ ràng rằng.
MarcinJuraszek

Không chỉ một dòng mới mà cả (các) tab ban đầu của dòng mới. Để mô tả chính xác định dạng chuỗi thực tế khi sử dụng $@"trong studio trực quan, bạn phải bắt đầu mỗi dòng mới từ phía bên trái của trình soạn thảo văn bản.
GDS

Với giải pháp này, bạn không thể sử dụng ví dụ: \ r và \ n trong chuỗi
Johan Franzén

22

Trong khi OP yêu cầu một cái gì đó khác, tôi hy vọng nhiều người đọc câu hỏi này sẽ thích một đa tuyến được nội suy $""hoạt động như thế nào @"". Để làm điều đó, sử dụng$@""

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

3
Anh ta không muốn các dòng mới trong đầu ra, chỉ là mã tự bọc trên các dòng khác nhau
Martin Capodici

7
Ông nói rõ rằng câu trả lời này dành cho những khán giả đến tìm kiếm cách thực hiện các chuỗi đa dòng bằng cú pháp nội suy chuỗi.
Trái phiếu Brandon

2

Đây là nó:

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

Lưu ý thứ hai $trong$"..." + $"..."


18
Lưu ý rằng điều này sẽ thực hiện hai cuộc gọi tới String.Format và cũng tạo ra ba chuỗi trong bộ nhớ (Bên A, Bên B và A + B)
Kevin Kalitowski

1
Điều này sẽ không ngăn bạn sử dụng một FormattableStringchuỗi trên chuỗi nối?
binki

4
Trong nhiều triển khai hiện nay, chạy trên CPU GHz với bộ nhớ Gb, một cuộc gọi thêm và một chuỗi bổ sung sẽ không cung cấp cho bạn các vấn đề về hiệu suất. Các vấn đề về hiệu năng sẽ được gây ra bởi ví dụ sử dụng thuật toán O (n2). Tôi nghĩ thật không công bằng khi hạ bệ anh chàng này.
Johan Franzén

1

Tôi đã sử dụng StringBuilder trong phần ghi đè ToString () làm ví dụ.

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

Vậy thì tại sao không buffer.AppendFormat("{0}Number: {1}", Environment.NewLine, EmployeeNumber);???
TS
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.