2010-11-20 29 views
15
String s1 = "Hello"; 
    String s2 = "Hello"; 

Đây s1, s2 là khác nhau nhưng sau đó tại sao ReferenceEquals() đang trở lại đúngtại sao ReferenceEquals (s1, s2) trả về true

+1

Tại sao bạn viết rằng chúng khác nhau? – Lucero

+0

@ Lucero- int c = 5; int b = 5; Console.WriteLine (object.ReferenceEquals (b, c)); trả về false, nó khác với trường hợp chuỗi chỉ – user498432

+1

trong trường hợp 'int', câu lệnh đó liên quan đến * boxing *, vì' ReferenceEquals' chấp nhận '(đối tượng, đối tượng)' - đó là một ** ** kịch bản khác nhau ** ; 'string' là một kiểu tham chiếu, vì vậy không yêu cầu boxing. –

Trả lời

26

Điều này là do thực tập - CLI tự động tái sử dụng các chuỗi thu được dưới dạng literals (tức là các chuỗi đã đến trực tiếp từ mã nguồn của bạn). Lưu ý rằng nếu bạn đã làm:

char[] chars = {'h','e','l','l','o'}; 
string s1 = new string(chars); 
string s2 = new string(chars); 

họ sẽ không là ví dụ cùng một chuỗi, vì họ đã không đến từ literals.

Đây là tài liệu chống lại Ldstr IL instruction:

Cơ sở hạ tầng Common Language (CLI) đảm bảo rằng kết quả của hai hướng dẫn ldstr đề cập đến hai thẻ siêu dữ liệu có cùng một chuỗi ký tự trở chính xác đối tượng cùng một chuỗi (một quá trình được gọi là "chuỗi interning").

2

Strings là không thay đổi, một khi nó được tạo ra trong bộ nhớ sau cùng đối tượng String được giới thiệu đến các tạo ra trước đó đối tượng String để biết thêm http://msdn.microsoft.com/en-us/library/362314fe.aspx

+1

À, nó hơi hạn chế hơn một chút; interning (ít nhất, tự động interning) chỉ áp dụng cho * literals *. –

1

nếu bạn google "ReferenceEquals chuỗi"

bạn' sẽ nhận được this

Sau đây là câu trả lời được chấp nhận từ liên kết, trong trường hợp liên kết chết

Trong ví dụ này "obj1" và "obj2" là các trường hợp riêng biệt, phải không?

Không có chuỗi là loại tham chiếu, và obj1 và obj2 là hai biến trỏ đến cùng một cá thể, một phần do một thứ gọi là interning; về cơ bản, bất kỳ chuỗi ký tự nào trong một assembly * có thể chia sẻ cùng một tham chiếu chuỗi. Điều này có thể chỉ vì các chuỗi không thay đổi được. Bạn cũng có thể kiểm tra các chuỗi nội bộ (string.IsInterned) và thực tập thủ công nếu bạn muốn (string.Intern).

Khi hai chuỗi có cùng giá trị, chúng có chia sẻ cùng một trường hợp không?

Họ có thể có cùng một trường hợp; nhưng nó không được bảo đảm. Các chuỗi đã được tạo liên tục sẽ không được tập trung; ví dụ: những người duy nhất chia sẻ tài liệu tham khảo ở đây là 2 & 4:

chuỗi tmp1 = "aa", tmp2 = "aaa";

chuỗi s1 = new string ('a', 5),

s2 = "aaaaa",

s3 = tmp1 + tmp2,

s4 = "aaaaa";

Bảng điều khiển.WriteLine (ReferenceEquals (s1, s2));

Console.WriteLine (ReferenceEquals (s1, s3));

Console.WriteLine (ReferenceEquals (s1, s4));

Console.WriteLine (ReferenceEquals (s2, s3));

Console.WriteLine (ReferenceEquals (s2, s4));

Console.WriteLine (ReferenceEquals (s3, s4));

* = Nghiêm: net-mô-đun

+1

Wow; điều đó đưa tôi trở lại một vài năm :) –

+0

điều đó thật thú vị, là một "thế giới nhỏ" :) – shevski

2

String là immutable nên sử dụng cùng một tài liệu tham khảo cho cùng một giá trị Xem thêm Eric lippert blog cho tất cả về điều này

1

Bạn cũng có thể sử dụng String.Copy(String str) phương pháp tĩnh để tạo ra chuỗi sẽ là các đối tượng khác nhau

String s1 = "Hello"; 
String s2 = string.Copy("Hello"); 

thì s1 và s2 sẽ tham chiếu các đối tượng khác nhau.

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