国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

HashCode與IEqualityComparer接口

2019-11-17 03:12:48
字體:
來源:轉載
供稿:網友

HashCode與IEqualityComparer接口

HashCode對于我這種菜鳥來說,聽過,見過,但是具體是干什么的,我不知道。問度娘,看著大家五花八門的解釋,我蛋疼了,于是今天有空閑就研究下這玩意,看看這玩意到低是干什么的。 在Msdn上對于Hashcode是這樣:用作特定類型的哈希函數。這句話不得不說很抽象,不過還好有備注:GetHashCode方法的默認實現不保證針對不同的對象返回唯一值。 而且,.NET Framework 不保證 GetHashCode 方法的默認實現以及它所返回的值在不同版本的 .NET Framework 中是相同的。 因此,在進行哈希運算時,該方法的默認實現不得用作唯一對象標識符。

好吧,不扯這些理論東西了,大家沒事可以去MSDN看看這個東西,我們用代碼驗證下這玩意。

1,值類型的HashCode分析:

class PRogram     {        static void Main(string[] args)        {            int hashCodeA = 0;            int hashCodeB = 0;            Console.WriteLine("hashCodeA的值和hashCodeB的值相等的情況Hashcode值分別是");            Console.WriteLine(hashCodeA.GetHashCode()+"::::"+hashCodeB.GetHashCode());            hashCodeB = 1;            Console.WriteLine("hashCodeA的值和hashCodeB的值不相等的情況Hashcode值分別是");            Console.WriteLine(hashCodeA.GetHashCode() + "::::" + hashCodeB.GetHashCode());        }    }

運行的結果:

LC1YWB}5S`)VE[]~3)R@E6Q

來,小伙伴們,我們來看第二值類型:關于Struct的

public struct StructHashCode//定義一個結構體    {      public int a;     public int b;    }

class Program    {        static void Main(string[] args)        {            StructHashCode sCode1 = new StructHashCode();            sCode1.a = 1;            sCode1.b = 1;            StructHashCode sCode2 = new StructHashCode();            sCode2.a = 1;            sCode2.b = 1;            if (sCode1.GetHashCode() == sCode2.GetHashCode())                Console.WriteLine("我們是相等的哦,親");            else                Console.WriteLine("我們是不想等的哦,親");            Console.WriteLine("********華麗分割線***********");            sCode2.a = 1;            sCode2.b = 2;            if (sCode1.GetHashCode() == sCode2.GetHashCode())                Console.WriteLine("我們是相等的哦,親");            else                Console.WriteLine("我們是不想等的哦,親");            Console.WriteLine("********華麗分割線***********");            sCode2.a = 2;            sCode2.b = 2;            if (sCode1.GetHashCode() == sCode2.GetHashCode())                Console.WriteLine("我們是相等的哦,親");            else                Console.WriteLine("我們是不想等的哦,親");                  }

   }

運行結果:(看到這個結果我想罵娘了)

T7WA6S~8ST5K~AGCUVRT[Q5

這兩個關于值類性的例子大家是不是有種困惑的感覺,很抱歉的是,我也不能給大家解釋這是為什么,但是我們最起碼驗證了:HashCode看來是個棧地址是沒什么關系的。希望有大拿幫我解惑。

2,引用類型的HashCode分析:

class Program    {        static void Main(string[] args)        {            ClassHashCode classCode1 = new ClassHashCode();            ClassHashCode classCode2 = new ClassHashCode();            ClassHashCode classCode3 = classCode1;            Console.WriteLine("classCode1和classCode2的HashCode進行比較");            if (classCode1.GetHashCode() == classCode2.GetHashCode())                Console.WriteLine("我們是相等的哦,親");            else                Console.WriteLine("我們是不想等的哦,親");            Console.WriteLine("******華麗的分割線******");            Console.WriteLine("classCode1和classCode3的HashCode進行比較");            if (classCode1.GetHashCode() == classCode3.GetHashCode())                Console.WriteLine("我們是相等的哦,親");            else                Console.WriteLine("我們是不想等的哦,親");

}

}    public class ClassHashCode    {

}

運行的結果:

KPA2%W__%V%(QQ8[HG4IWKT

那么關于classCode1 和classCode2和classCode3之間的關于堆和棧的那點區別,在這我就本給大家敘述了,不懂可以問問度娘。

到這里我想就可以做個總結了:無論是值類型還是引用類型,最終來說都是Object對象,那么對象與對象之間如果相等,HashCode一定是一樣的,如果不想等,HashCode也不一定不一樣(因為有值類型這樣的怪東西)。事情發展到這里大家就多少明白點了吧,HashCode有太多不確定的。以上是個人觀點,希望大拿指正。。

上文提到classCode1和classCode2是不想等的,但是如果我們忽略HashCode不相等(堆和棧的引用地址不等,這時候看來,HashCode好像也和地址有關聯),那么我就可以認為他們是相等的了,大家是不是就想到對象的重復的篩選。

IEqualityComparer<T>就出現啦,他的具體含義大家可以看看MSDN哦 ,具體代碼實現:

class Program {      static void Main(string[] args)      {          UserComparer userCom

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 佛冈县| 台东县| 铜鼓县| 花垣县| 温泉县| 汝南县| 金阳县| 图木舒克市| 平利县| 株洲县| 增城市| 沙洋县| 文成县| 那曲县| 重庆市| 通河县| 张北县| 博白县| 资溪县| 南郑县| 密云县| 福安市| 应城市| 高平市| 枣强县| 赣州市| 林州市| 靖江市| 平泉县| 宜章县| 肇源县| 巫溪县| 介休市| 瑞丽市| 大田县| 闸北区| 兴和县| 南丹县| 白朗县| 井冈山市| 宁远县|