Trả về StringBuilder nếu bạn định sửa đổi chuỗi, nếu không thì trả về chuỗi. Đây là một câu hỏi API.
Về hiệu quả. Vì đây là một câu hỏi mơ hồ/chung chung mà không có bất kỳ chi tiết cụ thể nào thì tôi nghĩ rằng có thể thay đổi so với bất biến là quan trọng hơn hiệu suất. Mutability là một vấn đề API cho phép các đối tượng có thể sửa đổi của API của bạn. Độ dài chuỗi không liên quan đến điều này.
Điều đó nói. Nếu bạn nhìn vào StringBuilder.ToString với Reflector:
public override string ToString()
{
string stringValue = this.m_StringValue;
if (this.m_currentThread != Thread.InternalGetCurrentThread())
{
return string.InternalCopy(stringValue);
}
if ((2 * stringValue.Length) < stringValue.ArrayLength)
{
return string.InternalCopy(stringValue);
}
stringValue.ClearPostNullChar();
this.m_currentThread = IntPtr.Zero;
return stringValue;
}
Bạn có thể thấy nó có thể tạo một bản sao nhưng nếu bạn sửa đổi nó với StringBuilder sau đó nó sẽ tạo một bản sao sau đó (đây là những gì tôi có thể nói điểm m_currentThread là bởi vì Append kiểm tra điều này và sẽ sao chép nó nếu nó không khớp với chuỗi hiện tại).
Tôi đoán kết thúc này là nếu bạn không sửa đổi StringBuilder thì bạn không sao chép chuỗi và độ dài không liên quan đến hiệu quả (trừ khi bạn nhấn thứ 2 nếu).
CẬP NHẬT
System.String là một lớp học có nghĩa là nó là một loại tài liệu tham khảo (như trái ngược với kiểu giá trị) để "chuỗi foo;" về cơ bản là một con trỏ. (Khi bạn truyền một chuỗi vào một phương thức, nó truyền con trỏ, chứ không phải bản sao.) System.String có thể thay đổi bên trong mscorlib nhưng không thay đổi bên ngoài nó, đó là cách StringBuilder có thể thao tác một chuỗi.
Vì vậy, khi ToString() được gọi là nó trả về đối tượng chuỗi nội bộ của nó bằng cách tham chiếu. Tại thời điểm này, bạn không thể sửa đổi nó vì mã của bạn không có trong mscorlib. Bằng cách đặt trường m_currentThread thành 0 thì bất kỳ thao tác nào khác trên StringBuilder sẽ làm cho nó sao chép đối tượng chuỗi để nó có thể được sửa đổi và không sửa đổi đối tượng chuỗi mà nó trả về trong ToString(). Hãy xem xét điều này:
StringBuilder sb = new StringBuilder();
sb.Append("Hello ");
string foo = sb.ToString();
sb.Append("World");
string bar = sb.ToString();
Nếu StringBuilder không tạo bản sao vào cuối foo sẽ là "Hello World" vì StringBuilder đã sửa đổi nó. Nhưng vì nó đã tạo ra một bản sao thì foo vẫn chỉ là "Hello" và thanh là "Hello World".
Điều đó có làm rõ toàn bộ thông tin trả lại/tham chiếu không?
Nguồn
2009-05-07 12:55:00
@SkippyFire đang hỏi về hiệu quả. –
-1. Nếu bạn tiếp tục sửa đổi chuỗi, nó sẽ được sửa đổi thêm trong phương thức. Điều gì nếu phương pháp này được gọi từ nhiều nơi và logic thao tác chuỗi thay đổi? Nó sẽ không được tốt để có cập nhật logic ở nhiều nơi –
Nick, bạn đang tách lông. Nếu đây là một lớp và một phương thức riêng tư, bạn có thể vượt qua StringBuilder với nhiều phương thức để xây dựng chuỗi cuối cùng. Bạn có thể làm cùng một điều mà mỗi phương thức trả về một chuỗi và nối chúng lại. SkippyFire không cụ thể về cách sử dụng nó. Điều này khá đơn giản: nếu bạn cần có thể thay đổi được, sau đó trả về có thể thay đổi, nếu bạn không cần tắt tiếng thì không thể trả lại được. –