首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

dotnet C# 实现 GetHashCode 的方法

本文来聊聊在重写某个类的 GetHashCode 方法时,可以如何实现 GetHashCode 的返回值 按照 GetHashCode 方法的原则,要求两个对象如果 Equals 返回 true 那么一定要求...当然,反过来不成立,也就是两个对象返回的 GetHashCode 的值相同,对象可以是不相等的 实现 GetHashCode 方法的方式有很多,最简单的就是通过调用基类的 GetHashCode 方法,...类型的,也就是调用了 object 的 GetHashCode 方法,其实和调用 RuntimeHelpers 的 GetHashCode 方法是相同的,因为在 object 方法里面的 GetHashCode...} 如果某个类型只有一个字段,期望是作为此字段的包装,那么可以通过返回此字段的 GetHashCode 的值 public class Degree { public Degree...} 如上面代码,返回的就是 IntValue 的 GetHashCode 的值 而如果期望有自己的定制化,可以通过 HashCode 结构体实现定义,例如在 Program 类里面有属性定义如下

73730
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C# - 实现类型的比较

    如果某个类型的实例需要与该类型的其它实例进行比较或者排序的话,那么该类型就可以通过实现IComparable接口来达到此目的。 IComparable只提供了一个方法: ?...在自定义类型上实现比较 其实我通常不在我的类型上去实现IComparable,包括引用类型和原始类型。...更好的办法是实现某种比较器。 但是有时候还是需要实现IComparable,那么下面就讲一下怎么做。 值类型 Person Struct: ? 如果直接使用我们之前的方法,则会报错: ?...很简单,直接调用了字段Height的CompareTo方法,因为int类型实现了IComparable接口。 实现比较操作符 一共四个操作符:, =,必须都得实现。...=都实现了,那么其它的相等性判断方法也应该一同实现: object.Equals() object.GetHashCode() IEquatable 看起来挺麻烦,但这只是一个struct,还是相对简单的

    1K20

    dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性或字段做哈希值

    在 C# 里面,所有的对象都继承 Object 类型,此类型有开放 GetHashCode 用于给开发者重写。...反过来则不然,允许有两个不相等的对象的 GetHashCode 是相等的 在重写 Equals 方法时,大部分时候都是自动生成的,如将类里面的所有字段或属性都进行一一比较。...本文将来告诉大家为什么这是不安全的 在 dotnet 里面,大部分会用到 GetHashCode 的逻辑都在于哈希容器里面,如 Dictionary 字典等。...这些哈希容器在设计上都期望类型遵守以下行为:当两个对象相等的时候,那么获取 GetHashCode 的值也一定相等 假定有类型的 GetHashCode 返回值是基于非只读的属性或字段,将会导致在将对象加入哈希容器的时候...不过在理解了这个行为,在某些特别的业务里面,也可以利用此行为实现有趣的功能 通过本文也可以了解到,对于 GetHashCode 的返回值也不能为了因为重写 Equals 方法而被 VS 警告而随便写此方法的实现

    63120

    C# 9.0新特性

    这篇文章基于, C# 9.0候选新特性 原生大小的数字类型 这次引入一组新类型(nint,nuint,nfloat等)'n'表示native(原生),该特性允许声明一个32位或64位的数据类型,这取决于操作系统的平台类型...在函数式编程中,Type Classes允许您在类型上添加一组操作,但不实现它。由于实现是在其他地方完成的,这是一种多态,它比面向对象编程语言中的class更灵活。...我引用了官方提案中的一些结论: “一般来说,”shape“(shape是Type Classes的一个新的关键字)声明非常类似于接口声明,除了以下情况, 它可以定义任何类型的成员(包括静态成员) 可以通过扩展实现...类型“a”是类“Eq”的实例。...可以通过以下方式声明一个安全的固定大小的缓冲区, public fixed DXGI_RGB GammaCurve[1025]; 该声明将由编译器转换为内部表示,类似于以下内容, [FixedBuffer

    1.6K30

    【类型转换】使用c#实现简易的类型转换(Emit,Expression,反射)

    80%,但也给了我一个灵感,一个实现简易的类型转换的灵感,所以在上周我就把代码写了出来,不过由于工作的忙碌,今天才开始写博客,接下来就呈上。     ...EMIT     众所周知,我们的c#代码在编译器编译,都会编译成IL代码,最后再去通过JIT转化为机器码,运行在系统中去的,所以IL代码的性能是比c#代码高的,同时,学习的成本,编写的成本也是机器高,...,以下代码,除了反射,其他的我都加了注释,反射大家都看得懂。     ...下面的集合转集合,大致的原理代码就是定义一个方法ConvertToType,返回类型是List,入参是List,然后定义循环的开始结束变量,以及最终返回结果集,还有循环内部的时候,我们创建的变量...,表达式树的其实和Emit的我感觉都差不多,不过和emit相比,肯定大家都喜欢写Expression,毕竟是c#代码,写起来比较舒适,在下面代码就是定义了入参的source,以及从source那指定索引的

    33210

    如何重写object虚方法

    在 C# 中 Object 是所有类的基类,所有的结构和类都直接或间接的派生自它。...前面这段话可以说所有的 C# 开发人员都知道,但是我相信其中有一部分程序员并不清楚甚至不知道我们常用的 ToString 、 Equals 和 GetHashCode 虚方法都来自于 Object 类,...在 C# 中我们可以利用 object 类或者它的派生类中的 ReferenceEquals 静态方法来判断对象之间的同一性。...; 判断哈希码是否相等,这一步需进行短路操作和字段比较; 在基类的 Equals 方法被重写的前提下,必须检查基类的 Equals 方法; 判断关键字段的值是否相等; 重写 GetHashCode 方法...GetHashCode 和 Equals 中引发任何异常; 必须保证对象之间可以随意比较,且不能触发任何异常; 必须实现重写 Equals 、 GetHashCode 、 == 和 !

    79710

    C# 之 System.Object

    System.Object C#中全部的类都直接或间接继承自System.Object类,这使得C#中的类得以单根继承。...由于全部的类都继承与System.Object,所以这些类都能够訪问该类中受保护的成员和公共的成员。以下我们就一起来看看可使用的成员有哪些。...默认的实现代码会查看对象的參数是否引用了同一个对象(由于对象是引用类型)。...新对象的不论什么引用类型成员都将引用于源类同样的对象,这种方法是受保护的,所以仅仅能在类或派生的类中使用 class MyDerivedClass:MyBaseClass {...默认情况下,这是一个类类型的限定名称,但能够重写它,给类型提供合适的实现方式。默认情况下返回的是该对象所属类型的全名称。

    46420

    【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

    本文内容思维导图式总结 以下是本文内容,提高Unity中C#代码质量的22条准则的总结式思维导图: ?...6)因为实现实现访问的方法get与set是独立的两个方法,在C# 2.0之后,你可以给它们定义不同的访问权限,来更好的控制类成员的可见性。...对引用类型来讲,索然可以正常工作,但是效率很低。对值类型来讲,基类中的实现有时甚至不正确。而且,编写的自己GetHashCode( )也不可能既有效率又正确。...而抽象基类可以为派生类提供一些具体的实现。 3)基类描述并实现了一组相关类型间共用的行为。接口则定义了一组具有原子性的功能,供其他不相关的具体类型来实现。...● 共有四种不同的策略可以防止类型内部的数据结构遭到有意或无意的修改: 1)值类型。当客户代码通过属性来访问值类型成员时,实际返回的是值类型的对象副本。 2)常量类型。如System.String。

    1.8K30

    C#核编之内建数据类型

    这个随笔中的重点之一是说明:C#中所提供的关键字都是相应系统类型的简化符号(如int是System.Int32类型的简化符号) 一、内建数据类型与层级结构 所有的C#内建数据类型都支持默认的构造函数,简而言之...在C#中,每一个基本数据类型都有一个类层次结构,处于类层次顶端的类型会为派生类提供一些默认的行为。...以上所有的类型都派生自System.Object,它定义了一组.NET基础类库中所有类型都具有的方法(如:ToString()、Equals()、GetHashCode()等),下面通过一段简单的代码来了解一些这些基础方法...C#中的文本数据使用string和char关键字来表示的,他们是System.String和System.Char的简化符号,string表示一组连续的字符如"hello",而char则表示单个字符如...但是当你定义一个整数(如500),运行时将其默认设为int数据类型,同样,当设置(66.66)运行时则将其默认设置为double类型.这是C#内部的自动识别数据类型机制,虽然你是用的是BigInterger

    99760

    C# 终极基类Object介绍

    一、简介 Object这个类型,相信everyone都不陌生,这个是CLR定义的最基础的类型,俗称"上帝类"。...CLR(运行时)要求所有类型,不管是系统定义的类型还是自定义的类型,都必须从Object派生,所以以下代码从本质上是一样的,代码如下: /// /// 隐式派生自Object ///...Object,所以自定义类就算没有显示继承Object类,CLR还是会让自定义类默认继承Object类,由于所有的类型都从System.Object类型派生,所以每个类型的每个对象(实例)都会有一组最基本的方法...如果两个对象具有相同的值,就返回true,详情请参考C# 对象相等性判断和同一性判断 2、GetHashCode方法 返回对象的值的哈希值,详情请参考C# 对象哈希码 3、ToString方法 默认返回类型的完整名称...例如,核心类型(如Boolean和Int32)类型重写该方法来返回他们的值的字符串表示,另外处于调试的目地而重写该方法.调用后获得一个字符串,显示对象各字段的值.代码如下: static

    1.1K60

    精:C# 泛型集合类List使用总结

    本文主要主要介绍了C# 泛型集合类List使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 C#中List可谓是使用最广泛的一种数据类型了...跟List比较,他还是有一个优点的,就是他可以存储类型不一样的对象数据,而List泛型集合类,其中T必须是对他存储元素对象的约束,必须一致性!...而且ArrayList里面存放元素对象类型都不一致,在C#(强类型语言)中处理时,还需要判断,还要涉及到频繁装箱拆箱,性能不说,这不是自讨苦吃嘛.......引用类型则不行! 另外还一个类型比较特殊,也要单独拿出来提一嘴,就是string,在C#中它属于引用类型,但是它类似于值类型,可以直接进行比较,在这完全可以归属到值类型当中了。...泛型集合类List使用总结的文章就介绍到这了,希望本文对你有所收获。

    45130

    分享一篇开发杂文

    其实呢,我也不敢说以下的方式是最好的实现方式,但是一定是优于上文所述。 1、同样需要一个界面,操作开启通道,呼叫,输入发送的内容,显示接收的内容。...1.1.1 避免不必要的对象创建  由于垃圾回收的代价较高,所以C#程序开发要遵循的一个基本原则就是避免不必要的对象创建。以下列举一些常见的情形。 ...从实际经验看,使用Hashtable时,Equals方法的消耗一般会占到一半以上。 System.Object类提供了默认的GetHashCode实现,使用对象在内存中的地址作为散列码。...ExpressionList对象没有重载GetHashCode实现,其超类ArrayList也没有,这样最后用的就是System.Object类 的GetHashCode实现。...当然,最终还是会实现一个高效的GetHashCode方法的。

    89510
    领券