1 - Tham chiếu bằng kiểm tra nếu hai biến kiểu tham chiếu (lớp, không cấu trúc) được gọi cùng một địa chỉ bộ nhớ.
2 - Phương thức equals() ảo sẽ kiểm tra xem hai đối tượng có tương đương hay không.Chúng ta hãy nói rằng bạn có lớp học này:
class TestClass{
public int Property1{get;set}
public int Property2{get;set}
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TestClass))
return false;
var convertedObj = (TestClass)obj;
return (convertedObj.Property1 == this.Property1 && convertedObj.Property2 == this.Property2);
}
}
và bạn nhanh chóng 2 đối tượng từ lớp rằng:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
mặc dù hai đối tượng không phải là những ví dụ tương tự của TestClass, cuộc gọi đến o1.Equals (o2) sẽ trả về đúng sự thật.
3 - Phương thức tĩnh Equals được sử dụng để xử lý sự cố khi có giá trị null trong séc. Hãy tưởng tượng này, ví dụ:
TestClass o1 = null;
var o2 = new TestClass{property1 = 1, property2 = 2}
Nếu bạn cố gắng này:
o1.Equals(o2);
bạn wil nhận được một NullReferenceException, bởi vì điểm o1 không có gì. Để giải quyết vấn đề này, bạn làm điều này:
Object.Equals (o1, o2);
Phương pháp này được chuẩn bị để xử lý các tham chiếu null.
4 - Giao diện IEquatable được cung cấp bởi .Net, do đó bạn không cần phải thực hiện các phôi bên trong phương thức Bằng của bạn. Nếu trình biên dịch phát hiện ra rằng bạn đã triển khai giao diện trong một lớp cho kiểu bạn đang cố gắng kiểm tra sự bình đẳng, nó sẽ ưu tiên phương thức đó hơn đối tượng Object.Equals (Object). Ví dụ:
class TestClass : IEquatable<TestClass>
{
public int Property1 { get; set; }
public int Property2 { get; set; }
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(TestClass))
return false;
var convertedObj = (TestClass)obj;
return (convertedObj.Property1 == this.Property1 && convertedObj.Property2 == this.Property2);
}
#region IEquatable<TestClass> Members
public bool Equals(TestClass other)
{
return (other.Property1 == this.Property1 && other.Property2 == this.Property2);
}
#endregion
}
bây giờ nếu chúng ta làm điều này:
var o1 = new TestClass{property1 = 1, property2 = 2}
var o2 = new TestClass{property1 = 1, property2 = 2}
o1.Equals(o2);
Các gọi là phương pháp là Equals (TestClass), trước khi Equals (Object).
5 - Toán tử == thường có nghĩa là ReferenceEquals, nó sẽ kiểm tra xem hai biến có trỏ đến cùng một địa chỉ bộ nhớ hay không. Gotcha là toán tử này có thể được ghi đè để thực hiện các loại séc khác. Trong chuỗi, ví dụ, nó kiểm tra nếu hai trường hợp khác nhau là tương đương.
Đây là một liên kết hữu ích để hiểu bình đẳng trong Net tốt hơn:
Tuyệt vời. Các ví dụ thực sự giúp đỡ, nhưng có một lỗi đánh máy trong điểm 4 của bạn, nơi IEquatable.Equals vẫn sử dụng 'conversionObj' – PaulG
Cảm ơn PaulG, nó đã được sửa! =] – mverardo