2015-03-09 20 views
6

Từ https://msdn.microsoft.com/en-us/library/d5x73970.aspxC# điều hành chung các loại bình đẳng

Khi áp dụng những nơi T: lớp hạn chế, tránh == và = nhà khai thác trên các tham số loại vì các nhà khai thác sẽ kiểm tra cho sắc tham khảo, không! cho bình đẳng giá trị. Đây là trường hợp ngay cả nếu các toán tử này bị quá tải trong một loại được sử dụng làm đối số . Đoạn mã sau minh họa điểm này; đầu ra là sai mặc dù lớp String quá tải toán tử ==.

public static void OpTest<T>(T s, T t) where T : class 
{ 
    System.Console.WriteLine(s == t); 
} 

static void Main() 
{ 
    string s1 = "target"; 
    System.Text.StringBuilder sb = new System.Text.StringBuilder("target"); 
    string s2 = sb.ToString(); 
    OpTest<string>(s1, s2); 
} 

Tất cả mọi thứ là ok cho đến khi tôi đã cố gắng sau, với cùng một phương pháp

static void Main() 
{ 
    string s1 = "target"; 
    string s2 = "target"; 
    OpTest<string>(s1, s2); 
} 

Nó ra 'True', s1 và tài liệu tham khảo s2 đối tượng khác nhau trong bộ nhớ ngay cả khi họ có cùng đúng giá trị? Tui bỏ lỡ điều gì vậy?

Trả lời

7

Strings đang thực tập nội trú trong .NET, vì vậy khi bạn làm

string s1 = "target"; 
string s2 = "target"; 

họ đều trỏ đến cùng một đối tượng. Đây là lý do tại sao ví dụ MSDN sử dụng một StringBuilder, điều này sẽ đánh lừa CLR trong việc tạo một đối tượng chuỗi khác có cùng giá trị sao cho phép toán tử trong phương thức generic sẽ trả về false.

+1

Điều này là chính xác. Nó có thể được nhìn thấy tại [MSDN ở đây] (https://msdn.microsoft.com/en-us/library/aa691090%28v=vs.71%29.aspx), "Khi hai hoặc nhiều chuỗi ký tự tương đương theo toán tử bình đẳng chuỗi (Mục 7.9.7) xuất hiện trong cùng một assembly, các chuỗi ký tự chuỗi này tham chiếu đến cùng một cá thể chuỗi. " –

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