C# 我将如何处理.NET对象哈希代码?
C#中的对象有四个方法{C# 我将如何处理.NET对象哈希代码?,c#,.net,C#,.net,C#中的对象有四个方法{Equals,GetType,ToString,GetHashCode。 有人可以用哈希代码做什么有用的事情 有人可以用hashcode做什么有用的事情 快速找到可能相等的对象 特别是,此方法通常由(键)和等类型使用 但是,您不应该假定具有相同哈希代码的对象是相等的。有关更多信息,请参阅,有关哈希代码使用的更一般性讨论,请参阅本页 哈希代码是用于标识对象的数值 在平等测试期间。它还可以用作对象的索引 在一个集合中 GetHashCode方法适用于哈希算法和 数据结构,如哈
Equals
,GetType
,ToString
,GetHashCode
。有人可以用哈希代码做什么有用的事情 有人可以用hashcode做什么有用的事情 快速找到可能相等的对象 特别是,此方法通常由(键)和等类型使用 但是,您不应该假定具有相同哈希代码的对象是相等的。有关更多信息,请参阅,有关哈希代码使用的更一般性讨论,请参阅本页 哈希代码是用于标识对象的数值 在平等测试期间。它还可以用作对象的索引 在一个集合中 GetHashCode方法适用于哈希算法和 数据结构,如哈希表 GetHashCode方法的默认实现没有 确保不同对象的返回值唯一。此外 .NET Framework不保证 GetHashCode方法,它返回的值在 不同版本的.NET Framework。因此,违约 此方法的实现不能用作唯一对象 用于哈希目的的标识符 GetHashCode方法可以由派生类型重写。价值 类型必须重写此方法以提供 适用于该类型,并在 哈希表。为了唯一性,哈希代码必须基于值 用于实例字段或属性而不是静态字段或属性 财产 在哈希表对象中用作键的对象也必须重写 GetHashCode方法,因为这些对象必须生成自己的哈希 代码。如果用作键的对象未提供有用的 实现GetHashCode时,可以指定哈希代码提供程序 当构建哈希表对象时。在.NET框架之前 版本2.0时,哈希代码提供程序基于 System.Collections.IHashCodeProvider接口。从版本开始 2.0,哈希代码提供程序基于 System.Collections.IEqualityComparer接口
:基本思想是,如果两个对象具有不同的哈希代码,则它们是不同的。如果它们具有相同的哈希代码,则它们可能不同或相等 若要检查集合中是否存在对象,可以首先检查哈希代码,如果比较整数,这很快,然后仅对具有相同哈希代码的对象执行更精确的测试 例如,这在集合类中使用。GetHashCode
GetHashCode
仅为这两种类型的好处而存在
->哈希表
->通用词典
GetHashCode为您提供各种键以获得良好的哈希表性能
等于
当编译时类型未知时,Equals提供了一个null-safe
相等比较。
它的签名是
公共静态布尔等于(对象A、对象B)
所以不能使用像==
或这样的运算符=如果类型在编译时未知,则必须使用Equals
它在编写泛型类型时很有用
例如:
class Test<T>
{
T value;
public void SetV(T newValue)
{
if(object.Equals(newValue,value))
//We have to use Object.Equals cant use == or !=since they cannot bind to unknown type at compile time
}
}
类测试
{
T值;
公共无效SetV(T新值)
{
if(object.Equals(newValue,value))
//我们必须使用Object.Equals不能使用==或!=因为它们不能在编译时绑定到未知类型
}
}
托斯特林
它返回类型实例的默认texualrepresentation
。此方法被所有内置类型覆盖
GetType
GetType
在运行时进行计算。它帮助我们了解类型的名称
、组合
、基本类型
。以及其他键?equals方法不认为键是不同的吗?(IEquatable)?@RoyiNamir:是的,但它们首先是通过哈希代码进行比较的——因为这样你可以便宜地得到一个潜在的匹配。否则,从字典中进行的每次提取都需要检查每个键是否相等。@RoyiNamir:我根本没有提到编译器。但至于为什么它值得进行潜在匹配——如果你有一个有一百万个键的字典,你愿意检查两个都有相同哈希代码的潜在匹配,还是所有一百万个键的潜在匹配?@JonSkeet,这样不同的哈希代码就没有机会被检查是否相等了?(因为他们不是潜在的对手)?谢谢您的回复。@RoyiNamir:是的-如果两个对象有不同的散列码,那么它们必须是不相等的(为了遵守约定),所以比较它们是否相等是没有意义的。阅读维基百科页面。