Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我将如何处理.NET对象哈希代码?_C#_.net - Fatal编程技术网

C# 我将如何处理.NET对象哈希代码?

C# 我将如何处理.NET对象哈希代码?,c#,.net,C#,.net,C#中的对象有四个方法{Equals,GetType,ToString,GetHashCode。 有人可以用哈希代码做什么有用的事情 有人可以用hashcode做什么有用的事情 快速找到可能相等的对象 特别是,此方法通常由(键)和等类型使用 但是,您不应该假定具有相同哈希代码的对象是相等的。有关更多信息,请参阅,有关哈希代码使用的更一般性讨论,请参阅本页 哈希代码是用于标识对象的数值 在平等测试期间。它还可以用作对象的索引 在一个集合中 GetHashCode方法适用于哈希算法和 数据结构,如哈

C#中的对象有四个方法{
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:是的-如果两个对象有不同的散列码,那么它们必须是不相等的(为了遵守约定),所以比较它们是否相等是没有意义的。阅读维基百科页面。