Chuỗi được coi là loại tham chiếu nhưng có thể hoạt động như giá trị. Khi nông sao chép một cái gì đó bằng tay hoặc với MemberwiseClone(), các chuỗi được xử lý như thế nào? Họ có được phân biệt riêng biệt và tách biệt khỏi bản sao và chủ không?Làm thế nào để chuỗi hoạt động khi nông sao chép một cái gì đó trong C#?
Trả lời
Chuỗi LÀ loại tham chiếu. Tuy nhiên chúng không thay đổi được (chúng không thể thay đổi được), vì vậy nó sẽ không thực sự quan trọng nếu chúng được sao chép theo giá trị, hoặc được sao chép bằng tham chiếu.
Nếu chúng được sao chép nông thì tham chiếu sẽ được sao chép ... nhưng bạn không thể thay đổi chúng để bạn không thể ảnh hưởng đến hai đối tượng cùng một lúc.
Bạn chỉ đang sao chép tài liệu tham khảo (nghĩ "con trỏ"); hai tham chiếu là riêng biệt (nhưng có cùng giá trị), nhưng chỉ có một đối tượng chuỗi đơn.
Hãy xem xét điều này:
public class Person
{
string name;
// Other stuff
}
Nếu bạn gọi MemberwiseClone, bạn sẽ kết thúc với hai trường hợp riêng biệt của Người, nhưng name
biến của họ, trong khi riêng biệt, sẽ có giá trị như nhau - họ sẽ tham khảo cùng một thể hiện chuỗi. Điều này là bởi vì nó là một bản sao nông.
Nếu bạn thay đổi tên trong một trong các trường hợp đó, điều này sẽ không ảnh hưởng đến nhau, vì hai biến tự tách biệt - bạn chỉ thay đổi giá trị của một trong số chúng để tham chiếu đến một chuỗi khác.
Vì vậy, khi tôi thay đổi chuỗi trong đối tượng sao chép, một chuỗi mới được tạo với một tham chiếu mới? Vì vậy, khi tôi thực hiện một cái gì đó như oldString = oldString + "A", tôi đang tạo một đối tượng mới với một tham chiếu mới? – danmine
... điều này cũng giải thích tại sao String.Replace phải trả về một chuỗi mới, thay vì thay đổi chuỗi. – stusmith
Nếu bạn cần một chuỗi có thể thay đổi, hãy cân nhắc sử dụng StringBuilder. – stusmith