Tôi đang viết một trình bao bọc cho các phần tử XML cho phép nhà phát triển dễ dàng phân tích các thuộc tính từ XML. Trình bao bọc không có trạng thái nào khác ngoài đối tượng được bọc.
Tôi đang xem xét việc thực hiện sau đây (đơn giản hóa cho ví dụ này) bao gồm quá tải cho ==
toán tử.
class XmlWrapper
{
protected readonly XElement _element;
public XmlWrapper(XElement element)
{
_element = element;
}
public string NameAttribute
{
get
{
//Get the value of the name attribute
}
set
{
//Set the value of the name attribute
}
}
public override bool Equals(object other)
{
var o = other as XmlWrapper;
if (o == null) return false;
return _element.Equals(o._element);
}
public override int GetHashCode()
{
return _element.GetHashCode();
}
static public bool operator == (XmlWrapper lhs, XmlWrapper rhs)
{
if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true;
if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false;
return lhs._element == rhs._element;
}
static public bool operator != (XmlWrapper lhs, XmlWrapper rhs)
{
return !(lhs == rhs);
}
}
Theo tôi hiểu c # thành ngữ, ==
toán tử là cho đẳng thức tham chiếu trong khi Equals()
phương thức là cho đẳng thức giá trị. Nhưng trong trường hợp này, "giá trị" chỉ là một tham chiếu đến đối tượng được bọc. Vì vậy, tôi không rõ những gì là thông thường hoặc thành ngữ cho c #.
Ví dụ: trong mã này ...
var underlyingElement = new XElement("Foo");
var a = new XmlWrapper(underlyingElement);
var b = new XmlWrapper(underlyingElement);
a.NameAttribute = "Hello";
b.NameAttribute = "World";
if (a == b)
{
Console.WriteLine("The wrappers a and b are the same.");
}
.... chương trình đầu ra "Các hàm bao a và b có giống nhau không"? Hoặc đó sẽ là kỳ lạ, tức là vi phạm hiệu trưởng ít ngạc nhiên nhất ?
Equals
tôi không bao giờ vượt qua==
(nhưng không bao giờ cách khác). Là lười biếng thành ngữ? Nếu tôi có hành vi khác nhau mà không có diễn viên rõ ràng vi phạm ít kinh ngạc nhất.