2012-02-02 24 views
7

Tại sao trong tình huống này ReferenceEquals phương thức của đối tượng hoạt động khác nhau?ReferenceEquals làm việc sai với dây

string a= "fg"; 
string b= "fg"; 
Console.WriteLine(object.ReferenceEquals(a, b)); 

Vì vậy, trong trường hợp này, kết quả là true. Trong trường hợp, nó so sánh các giá trị của chuỗi của tôi và không tham chiếu. Nhưng khi tôi viết một cái gì đó như:

StringBuilder c = new StringBuilder("fg"); 
string d = c.ToString(); 
Console.WriteLine(object.ReferenceEquals(a, d)); 

Trong trường hợp này nó hoạt động tốt và kết quả là tham chiếu đối tượng của tôi.

+1

Ngay cả Chuck Norris cũng thuộc SO. Wow! – RBT

Trả lời

13

Ví dụ đầu tiên có hằng số biên dịch "fg" được tham chiếu bởi hai biến. Vì đây là một hằng số thời gian biên dịch, hai biến tham chiếu đến một đối tượng. Các tham chiếu bằng nhau.

Đọc chủ đề của thực hiện chuỗi để biết thêm về hành vi này. Là một starter, hãy xem xét:

Ví dụ, nếu bạn gán chuỗi chữ tương tự với một số biến, thời gian chạy lấy tài liệu tham khảo cùng với chuỗi chữ từ hồ bơi tập và gán nó vào mỗi biến.

http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

Trong ví dụ thứ hai, chỉ có một là một thời gian biên dịch liên tục, người kia là kết quả của một số hoạt động. ad không tham chiếu cùng một đối tượng, do đó bạn sẽ nhận được kết quả sai từ ReferenceEquals.

+0

@Henk, tôi không chắc bạn đang đi đâu với gấp, mặc dù tôi thừa nhận rằng tôi không hoàn toàn quen thuộc với khái niệm này. Việc đọc của tôi đơn giản là việc xếp chồng là một biểu thức chữ, ví dụ, '" f "+" g "' sẽ được trình biên dịch chuyển thành '" fg "'. Tuy nhiên, trong mã 'string a =" fg "; string b = "fg"; ', bạn mong đợi thấy trong IL phát ra IL_0000: ldstr" fg "/ IL_0005: stloc.0/IL_0006: ldstr" fg "/ IL_000B: stloc.1' –

+0

Và thực sự, nếu bạn cũng có 'string c =" f "+" g "', cùng một lệnh được phát ra để tải "fg". Đối với giáo dục của riêng tôi, đâu là gấp cho a và b? –

2

Hoạt động chính xác trong cả hai trường hợp.

Lý do ab là đối tượng chuỗi cùng là bởi vì trình biên dịch đã nhận thấy rằng bạn đã xác định cùng một chuỗi hai lần, và đã sử dụng lại các đối tượng cùng một chuỗi để khởi tạo cả ab.

Điều này thường xảy ra với mọi chuỗi liên tục trong ứng dụng của bạn.

0

Theo post này nó đã làm với một cái gì đó gọi là thực tập. a và b trong trường hợp của bạn hai biến trỏ đến cùng một cá thể, đó là lý do tại sao ReferenceEquals trả về true.

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