界: API Abuse
API 是调用方和被调用方之间的约定。最常见的 API 滥用是由于调用方未能遵守此约定的终止导致的。例如,如果某个程序在调用 chroot() 后未能调用 chdir(),则违反了用于指定如何安全地更改活动根目录的约定。库滥用的另一个典型示例是期望被调用方向调用方返回可信的 DNS 信息。在这种情况下,调用方通过对被调用方行为做出某种假设(返回值可用于身份验证目的)滥用其 API。另一方也可能违反调用方-被调用方约定。例如,如果编码器子类化 SecureRandom 并返回一个非随机值,则将违反此约定。
Object Model Violation: Just One of Equals() and GetHashCode() Defined
Abstract
这个类仅替代了
Equals()
和 GetHashCode()
中的一个。Explanation
.NET 对象预期执行一系列与等式相关的不变式。其中的一个常量是相同的对象必须具有相同的哈希码。换句话说,如果
如果未能支持这一常量,当此类对象存储在一个集合中时,可能就会引发一些问题。如果这种类的对象被用作哈希表中的关键值,或者被插入到一个词典中,那么确保相等的对象具有相等的哈希码将至关重要。
例 1:下面的类重写了
a.Equals(b) == true
,那么 a.GetHashCode() == b.GetHashCode()
。 如果未能支持这一常量,当此类对象存储在一个集合中时,可能就会引发一些问题。如果这种类的对象被用作哈希表中的关键值,或者被插入到一个词典中,那么确保相等的对象具有相等的哈希码将至关重要。
例 1:下面的类重写了
Equals()
,但没有重写 GetHashCode()
。
public class Halfway() {
public override boolean Equals(object obj) {
...
}
}
References
desc.structural.dotnet.object_model_violation.just_one_of_equals_hashcode_defined