2009-12-29 33 views
7

Tôi có một tuyên bố nơi một chuỗi được gán theo cách sau đây:Ghép nối chuỗi có hoặc không có. ToString()?

for (int i = 0; i < x; i++) 
{ 
    Foo.MyStringProperty = "Bar_" + i.ToString(); 
    /* ... */ 
} 

Có bất kỳ sự khác biệt về hiệu năng giữa i.ToString() hoặc chỉ đơn giản i, vì cả hai chỉ là chuyển đổi sang (văn hóa bất biến?) Chuỗi tương đương?

Tôi biết rõ về sự tồn tại của String.Concat(), String.Format, StringBuilder, v.v., vì lợi ích của trường hợp này, giả sử tôi chỉ có thể sử dụng kết nối +.

Xin cảm ơn trước.

+3

bạn không thể thực hiện một thử nghiệm? Hãy để nó lặp lại 10.000 lần, đo thời gian và bạn biết câu trả lời. – Natrium

+3

Caveat: 'ToString()' sử dụng văn hóa hiện tại. Nếu bạn muốn chuyển đổi độc lập với văn hóa, bạn sẽ phải sử dụng 'ToString (CultureInfo.InvariantCulture)' (Điều này quan trọng hơn khi xử lý các số dấu phẩy động so với số nguyên). –

Trả lời

23

+ kết nối sử dụng String.Concat anyway - String chính nó không hiển thị toán tử +.

Vì vậy, ví dụ:

int i = 10; 
string x = "hello" + i; 

được biên dịch vào:

int i = 10; 
object o1 = "hello"; 
object o2 = i; // Note boxing 
string x = string.Concat(o1, o2); 

Trong khi gọi ToString trực tiếp sẽ tránh boxing và gọi sự quá tải Concat(string, string). Do đó, phiên bản với cuộc gọi ToString sẽ là hơi hiệu quả hơn - nhưng tôi rất nghi ngờ rằng điều đó sẽ có ý nghĩa và tôi rất muốn bạn đi với phiên bản nào bạn cảm thấy dễ đọc hơn.

+0

Cảm ơn, câu trả lời rất rõ ràng. Mặc dù tôi muốn bị cám dỗ chấp nhận nhận xét của divo nếu đó là một câu trả lời thay vào đó, bởi vì ông ta đã báo trước về thông tin văn hóa. – Webleeuw

+0

Trong thử nghiệm của tôi, boxing và unboxing của một loại giá trị khi KHÔNG sử dụng phương thức ToString gây ra khoảng 2.5% hiệu suất hit. – Firestrand

+1

Thú vị. Tôi nghĩ có lẽ trình biên dịch C# sẽ tạo ra cùng một IL trong hai tình huống, nhưng bạn nói đúng, nó không (không phải với C# 5 hoặc là). Tình huống với kiểu tham chiếu hơi khác một chút. Ở đây mã "hello" + obj' sẽ không ném ngay cả khi 'obj' là tham chiếu null. Nhưng '" hello "+ obj.ToString()' sẽ ném nếu 'obj' là null, tất nhiên. Tuy nhiên, ngay cả với kiểu tham chiếu, kiểu có '.ToString()' rõ ràng về mặt lý thuyết có thể nhanh hơn (khi 'obj' là không null) vì nó sử dụng quá trình' Concat (string, string) 'thay vì' Concat (đối tượng) , đối tượng) 'overload. –

7

Chỉ cần sử dụng string + object bắt buộc gọi đến ToString() trên đối tượng - nó tương đương với việc gọi nó một cách rõ ràng.

+3

@Aviad: Tuy nhiên, có sự khác biệt về thời gian - điều này ảnh hưởng đến việc giá trị có được đóng hộp hay không. –

1

Tôi sẽ sử dụng. ToString() trong thói quen và khả năng đọc, tôi chắc chắn bạn sẽ tìm thấy hiệu suất tiết kiệm tốt hơn ở nơi khác.

3

ToString là phương pháp mặc định được sử dụng để viết đối tượng. Vì vậy, nếu bạn sử dụng "i" hoặc "i.ToString()" là điều tương tự.

Nếu bạn biết một chút về quá tải toán tử trong C++, bạn có thể hiểu cách "+" hoạt động trong trường hợp này.

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.IO; 
using System.Text; 


public class MainClass 
{ 
    public static void Main() 
    { 
     int number = 10; 
     string msg = "age is " + number + "."; 
     msg += " great?"; 
     Console.WriteLine("msg: {0}", msg); 

     String s1 = 10 + 5 + ": Two plus three is " + 2 + 3; 
     String s2 = 10 + 5 + ": Two plus three is " + (2 + 3); 
     Console.WriteLine("s1: {0}", s1); 
     Console.WriteLine("s2: {0}", s2); } 

} 

Kết quả: msg: tuổi là 10. tuyệt vời?

s1: 15: Hai cộng ba là 23

s2: 15: Hai cộng ba là 5

0
for(int i = 0; i < x; i++) { 
    Foo.MyStringProperty = "Bar_" + i.ToString(); 
    [...] 
} 

Kể từ đây kết quả của bạn là trong chuỗi và i là int, vì vậy "Bar _" + tôi được nối và sẽ gọi. ToString() cho đối tượng để có được gắn liền với một chuỗi. về hiệu suất mà bạn có thể sử dụng một số công cụ đo lường hiệu suất

Tôi thường sử dụng đúc, nếu tôi có hai đối tượng khác

+0

bình chọn tốt hay xấu nếu giải quyết được sự cố của bạn –

0

Như đã đề cập bởi Jon Skeet, điểm về đấm bốc là rất quan trọng!

Nếu bạn sử dụng rõ ràng ToString() không có quyền anh, nghĩa là không có hộp đối tượng được tạo xung quanh i. Hộp đối tượng xung quanh tôi phải được bỏ đi sau đó bởi Garbage Collector, gây ra một hình phạt hiệu suất.

Nếu bạn chỉ thực hiện một vài lần trong chương trình thì điều đó không quan trọng, nhưng nếu bạn thường xuyên đấm bốc, bạn nên chọn phiên bản ToString().

Các vấn đề liên quan