如何解决为什么属性的 Equals 方法比较字段?
当我检查属性是否相等时,我注意到它们已经有 Equals
方法来比较字段。对于自定义类,不会发生这种比较,因为它对性能不利,但为什么对属性进行了例外处理?
这是要确保的代码:
public class MyAttribute : Attribute
{
public int Value { get; }
public MyAttribute(int value) => Value = value;
}
public class MyClass
{
public int Value { get; }
public MyClass(int value) => Value = value;
}
public class Test
{
[Test]
public void TestEquals()
{
var myAttributeLeft = new MyAttribute(1);
var myAttributeRight = new MyAttribute(1);
var attributeEqualityResult = myAttributeLeft.Equals(myAttributeRight);
Console.WriteLine(attributeEqualityResult); // true
var myClassLeft = new MyClass(1);
var myClassRight = new MyClass(1);
var classEqualityResult = myClassLeft.Equals(myClassRight);
Console.WriteLine(classEqualityResult); // false
}
}
解决方法
简短回答:System.Attribute 实现了它自己的 Equals 实现,这与 System.Object 中的实现不同(MyClass 类继承自该实现)
您可以在ms docs
上找到更详细的答案 ,自定义属性不打算用作域对象:它们明确用于表示在编译时硬编码的元数据。假设它们按预期使用,这会给它们一些特殊的属性:
- 允许使用的类型有限制:通常是原生类型,如
int
和string
,以及这些原生类型的数组。 - 可以放入类型数组的项目数受写入实际代码文件的项目数限制。
在域模型中,比较集合的字段、属性和元素的值可能会造成巨大的性能损失:您不知道给定类的对象结构可能有多大,并且集合可能有数百万个其中的项目。但是上面提到的限制意味着自定义属性的相等比较的成本是有界的。显然 .NET 的创建者认为这使得赋予基类值语义是值得的,尽管文档包括 remarks 建议覆盖默认实现以使用对象相等性或硬编码值语义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。