Trong C#, chuỗi được thực tập. Tức là, nếu tôi tạo chuỗi foobar
và sử dụng nó lần thứ hai, C# sẽ chỉ có một thể hiện của chuỗi trong bộ nhớ và mặc dù tôi sẽ có hai tham chiếu, cả hai đều sẽ trỏ đến cùng một cá thể chuỗi. Đây là một trong những lý do tại sao các chuỗi là và có được bất biến trong C#.Hai chuỗi giống hệt nhau có thể là hai cá thể riêng biệt trong C# không?
Bây giờ, câu hỏi của tôi là, có thể bằng cách nào đó tạo ra hai chuỗi giống nhau để chúng không bị tập trung, nhưng chúng ta kết thúc với hai thể hiện chuỗi khác nhau trong bộ nhớ, với hai địa chỉ khác nhau, cùng một văn bản?
Nếu có, làm cách nào?
Và, điều này có thể xảy ra vô tình hay bạn cần xây dựng kịch bản một cách rõ ràng cho trường hợp này?
Và cuối cùng: Giả sử có hai cá thể chuỗi riêng biệt trong bộ nhớ có cùng giá trị, chúng có bằng nhau (theo điều khoản của ==
) không? Nếu vậy, làm cách nào để ==
hoạt động? Đầu tiên so sánh theo tham chiếu, sau đó theo giá trị, hoặc…?
"Trong C#, chuỗi được thực tập nội trú. " Không họ không. Chuỗi * hằng số * được tập trung. Các cá thể chuỗi chỉ được tập trung nếu bạn gọi 'String.Intern'. Interning mỗi chuỗi trung gian sẽ rất lãng phí. –
Được rồi, tôi không biết điều đó. Điều đó có nghĩa gì đối với hai trường hợp chuỗi có cùng giá trị? Họ có tham khảo cùng một "đối tượng" không? –
@GoloRoden '==' trên chuỗi thực hiện so sánh chuỗi (thư-by-letter, nếu có) trong C#. Nó không quan trọng nếu chúng được interned hay không, và nó không quan trọng mà bộ nhớ mà họ đề cập đến. –