2010-07-18 37 views
13

thể trùng lặp:
How should I concatenate strings?C#: nối chuỗi dễ đọc nhất. thực hành tốt nhất

Có một số cách để concat chuỗi trong công việc hàng ngày khi hiệu suất không phải là important.

  • result = a + ":" + b
  • result = string.Concat(a, ":", c)
  • result = string.Format("{0}:{1}", a, b);
  • StringBuilder approach
  • ...?

bạn thích điều gì và tại sao nếu hiệu quả không quan trọng nhưng bạn muốn giữ mã dễ đọc nhất đối với khẩu vị của mình?

+0

có, chúng trông tương tự nhưng tôi muốn tập trung vào khía cạnh dễ đọc chứ không phải trong việc thực hiện bên trong và cân nhắc hiệu suất. –

+0

FWIW, tôi tin rằng toán tử '+' ánh xạ tới phương thức 'Concat', vì vậy hai ví dụ đầu tiên là tương đương nhau. –

+0

@musicfreak: Từ quan điểm của IL, chúng có thể tương đương, từ góc nhìn dễ đọc, chắc chắn là không. – Steven

Trả lời

8

string.Format đối với tôi, nhưng trong thực tế tôi sử dụng cái nào phù hợp với mục đích, có tính đến hiệu suất tài khoản và khả năng đọc.

Nếu đó là hai biến tôi muốn sử dụng.

string.Concat(str1, str2);

Nếu nó chứa hằng số hoặc thứ gì đó yêu cầu định dạng thì.

string.Format("{0} + {1} = {2}", x, y, x + y);

Hoặc cho một cái gì đó giống như một truy vấn SQL

string SqlQuery = "SELECT col1, col2, col3, col4" + 
        "FROM table t " + 
        "WHERE col1 = 1"; 

Và xây dựng chuỗi khi thực hiện vấn đề này.

+0

Tối ưu hóa sớm là gốc rễ của mọi điều ác. Hay đại loại thế. – strager

+1

+1 vì mục đích dễ đọc. –

+0

+1 cho phương pháp. Tôi thậm chí đã tạo ra một cắt ngắn tôi sử dụng nó thường xuyên như vậy – gnome

2

String.Format(...) là chậm nhất.

Đối với các kết nối đơn giản không diễn ra trong vòng lặp, hãy sử dụng String.Concat(...) hoặc toán tử +, dịch sẽ giống như vậy dưới mui xe, afaik. Điều dễ đọc hơn là rất chủ quan.

Sử dụng một số StringBuilder để ghép nối đơn giản cũng là ưu tiên hàng đầu cho các kết nối đơn giản và có nhiều khả năng chi phí quá cao. Tôi chỉ sử dụng nó trong một vòng lặp.

+0

Cảm ơn bạn, nhưng làm thế nào để bạn nối chuỗi bình thường? Định dạng, +, Concat? –

+0

Tôi sẽ không đưa ra quyết định của mình chỉ dựa trên PERFORMANCE, trừ khi hiệu suất là cực kỳ quan trọng và nó đã được chứng minh rằng một cuộc gọi String.Format cụ thể là để đổ lỗi cho các vấn đề hiệu suất nghiêm trọng. Thông thường, bạn nên thích khả năng đọc và khả năng bảo trì cho hiệu suất. Điều đó đã được nói, tôi không có vấn đề với câu trả lời này vì nó là thực tế, nhưng nó chỉ cho tôi biết rằng ý nghĩa là hiệu suất là vua, và trong thực tế nó phải là xem xét cuối cùng của bạn cho rằng sự khác biệt về tốc độ được đo bằng phân số miliseconds. – mattmc3

+2

Cách 'thông thường nhất' là sử dụng '+' hoặc 'Concat', dịch sang cùng một từ afaik, và bạn thấy dễ đọc hơn là rất chủ quan. Tôi sẽ không sử dụng 'String.Format (...)' cho những thứ đơn giản vì nó chậm hơn (phải phân tích chuỗi định dạng) và dễ bị lỗi hơn. – herzmeister

1
  • string.Format

    cho vài concats. để biết thêm tôi sử dụng

  • StringBuilder cách tiếp cận

thậm chí nếu hiệu suất là không quan trọng. có một thỏa thuận nhóm tôi phải theo dõi

+0

Cảm ơn, chúng tôi cũng làm như vậy. Mặc dù một số nhà phát triển có xu hướng sử dụng + –

2

Đối với một cái gì đó như thế này (mà tôi đoán đang được gửi đến giao diện người dùng), tôi chắc chắn sẽ thích String.Format.Nó cho phép chuỗi được quốc tế hóa dễ dàng; bạn có thể grep cho các cuộc gọi đến String.Format và thay thế chúng bằng định dạng dịch của bạn.

+1

+1 để biết về địa phương hóa. –

2

sở thích cá nhân của tôi là:

tôi tìm ra + tiếp cận dễ đọc nhất và chỉ sử dụng Format() hoặc một StringBuilder nếu có một lý do chính đáng (i18n, hiệu suất vv) cho nó. Tôi (hầu như) không bao giờ sử dụng Concat.

Tôi nghĩ rằng tôi thấy cách tiếp cận + dễ đọc hơn Định dạng() đơn giản vì tôi không phải bỏ qua đến cuối để xem biến nào được đưa vào trong {} trình giữ chỗ. Và nếu các trình giữ chỗ không theo thứ tự số, thì sẽ càng khó đọc hơn nữa. Tuy nhiên, tôi đoán cho các dự án lớn hơn, chỉ cần thực thi bằng cách sử dụng Định dạng theo hướng dẫn kiểu trong trường hợp mã có thể được sử dụng lại trong một dự án yêu cầu i18n sau này.

8

Nó phụ thuộc vào việc sử dụng. Khi bạn chỉ muốn concat hai chuỗi, sử dụng a + b là dễ đọc hơn nhiều so với string.Format("{0}{1}", a, b). Tuy nhiên, nó trở nên phức tạp hơn, tôi thích sử dụng string.Format. Hãy so sánh này:

string x = string.Format("-{0}- ({1})", a, b); 

chống lại:

string x = "-" + a + "- (" + b + ")"; 

Tôi nghĩ rằng trong nhiều trường hợp nó là rất dễ dàng để phát hiện cách dễ đọc nhất để làm việc. Trong những trường hợp mà nó gây tranh cãi, cái nào dễ đọc hơn, chỉ cần chọn một, vì sếp của bạn không trả tiền cho những cuộc thảo luận vô nghĩa này ;-)

+2

+1 cho câu cuối cùng. :) Hầu hết thời gian nó thực sự không quan trọng; bạn có thể làm điều gì đó hiệu quả hơn việc quyết định sử dụng phương pháp nối chuỗi nào. –

+3

Đồng ý, nhưng thật khó để đo thời gian dành cho việc học lại những gì bạn hoặc người khác đã làm khi bạn phải duy trì mã đó. Thường thì thêm vài giây để làm cho một cái gì đó dễ đọc và dễ hiểu hơn sẽ giúp bạn tiết kiệm sau khi bạn chưa hoàn thành vấn đề và phải sửa chữa một cái gì đó. Vì vậy, bạn muốn viết mã dễ hiểu và phát triển những thói quen tốt. Bảo trì là một trong những chi phí lớn nhất cho các nhà phát triển của bạn và đó là điều mà sếp của bạn chắc chắn nên quan tâm. – mattmc3

+2

@mattmc: DGMW: Tôi nghĩ rằng khả năng bảo trì là (sau khi chính xác) các khía cạnh quan trọng nhất của phần mềm. Tôi đã thấy rất nhiều mã nghèo nàn trong sự nghiệp của tôi đã trở thành cơn ác mộng bảo trì. Thảo luận nó với các trường đại học của bạn là rất quan trọng để có được sự đồng thuận chung về những gì có thể đọc được nhiều nhất. Tuy nhiên, luôn có sự cân bằng giữa điều đó và năng suất. Như bạn đã nói, thật khó để đo lường điểm hòa vốn nằm ở đâu. Việc lưu các cuộc thảo luận này hữu ích cho tới một điểm. Những gì tôi đã cố gắng để nói là có những cuộc thảo luận bất tận về một số hương vị quá gần với khả năng đọc không phải là rất hữu ích. – Steven

1

Tôi thích String.Định dạng cho các chuỗi nhỏ và StringBuilder cho các chuỗi lớn hơn. Lý do chính của tôi là dễ đọc. Nó có thể đọc được nhiều hơn với tôi để sử dụng String.Format (hoặc StringBuilder.AppendFormat()), nhưng tôi phải thừa nhận rằng đó chỉ là sở thích cá nhân.

Để tạo văn bản thực sự lớn, bạn có thể muốn xem xét sử dụng mẫu mới (VS2010) T4 Preprocessed Templates - chúng rất đẹp.

Ngoài ra, nếu bạn đã từng sử dụng VB.NET, tôi thích kỹ thuật chữ XML Kathleen Dollard đã nói đến trong số episode 152 of hanselminutes.

+0

Cũng lưu ý rằng 'string.Format' sử dụng một' StringBuilder' trong nội bộ. – Steven

1

thích sử dụng:

String.Concat cho concatenations đơn giản như String.Concat("foo", bar);

String.Format để định dạng phức tạp như String.Format("<a href=\"{0}\">{1}</a>", url, text);

StringBuilder cho concatenations lớn như:

var sb = new StringBuilder(); 
sb.AppendLine("function fooBar() {"); 
sp.AppendLine(String.Join(Environment.NewLine, blah)); 
sp.AppendLine("}"); 
page.RegisterClientScript(page.GetType(), sb.ToString()); 

thích để tránh "foo" + "bar" (cũng như if (foo == "bar"). Và đặc biệt là String.Format("{0}{1}", foo, bar)

throw new Exception("This code was" + 
    "written by developer with" + 
    "13\" monitor"); 
Các vấn đề liên quan