Quá tải operator==
trong C# là cú pháp đường để gọi hàm tĩnh. Độ phân giải quá tải, giống như tất cả độ phân giải quá tải, xảy ra dựa trên loại tĩnh tĩnh của đối tượng, không phải loại động. Chúng ta hãy nhìn vào Object.ReferenceEquals
một lần nữa:
public static bool ReferenceEquals (Object objA, Object objB) {
return objA == objB;
}
Ở đây, loại tĩnh của objA
và objB
là Object
. Loại động có thể là bất kỳ thứ gì; một chuỗi, một số loại người dùng được xác định khác, bất cứ điều gì; không sao đâu. Việc xác định mà operator==
được gọi là được xác định tĩnh khi chức năng này được biên dịch, vì vậy bạn luôn nhận được mặc định, không quá tải, được xây dựng trong ngôn ngữ cung cấp một. .NET chỉ có thể không có ReferenceEquals
và cho phép người dùng thực hiện ((object)a) == ((object)b)
, nhưng có một hàm được đặt tên cụ thể để nói điều gì đang diễn ra cải thiện độ rõ ràng.
Object.Equals
, mặt khác, chỉ là một chức năng ảo. Kết quả là, Equals
được chọn dựa trên loại động của đối tượng ở bên trái của .Equals(
, giống như bất kỳ lệnh gọi hàm ảo nào khác.
Nguồn
2015-12-09 07:24:32
Im khá chắc chắn phần của chính ngôn ngữ C# và không phải là một phần của đối tượng. – Nahum
tính năng của nó bắt nguồn từ ngôn ngữ C#. ** Theo mặc định, toán tử == kiểm tra tính bình đẳng tham chiếu bằng cách xác định xem hai tham chiếu có cho biết cùng một đối tượng hay không, vì vậy các kiểu tham chiếu không cần thực hiện toán tử == để có được hàm này. ** - from [msdn] (https : //msdn.microsoft.com/en-US/library/ms173147 (v = vs.80) .aspx # Anchor_1) –