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

C# - 为值类型重定义相等

为什么要为值类型重定义相等性 原因主要有以下几点: 值类型默认无法使用 == 操作符,除非对它进行重写 再就是性能原因,因为值类型默认相等比较会使用装箱和反射,所以性能很差 根据业务需求,其实际相等意义和默认比较结果可能会不同...这里面我对三个属性进行了比较,使用了==操作符。其中==对于string来说就是比较值,而enum其实就是int,DateTime也是值类型,并且已经实现了相等性判断功能。...这个代码是resharper生成。...而类型里拥有GetHashCode()方法(返回Hash)真正目的是,允许该类型在内部使用HashTable集合中可以作为Key,因为HashTable需要这些哈希码。...为了让HashTable可以正确工作,Hash码有一个要求:如果两个实例被认为是相等,那么它们必须返回相同hash码。

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

Java基础不简单,谈谈hashCode()和equals()之间联系

Object类equals方法是用“==”号进行比较,在很多时候,因为==号比较是两个对象内存地址而不是实际值,所以不是很符合业务要求。...所以很多时候我们需要重写equals方法,去比较对象中每一个成员变量值是否相等。 问题来了 重写equals()方法就可以比较两个对象是否相等,为什么还要重写hashcode()方法呢?...因为HashSet、HashMap底层在添加元素时,会先判断对象hashCode是否相等,如果hashCode相等才会用equals()方法比较是否相等。...User对象,最后放到Set集合中去重。...这是重写hashCode方法情况,因为是用对象所有的成员变量值计算出哈希码,所以只要两个对象成员变量都是相等,则生成哈希码是相同。 ?

31540

Java 中 ==, equals 与 hashCode 区别与联系

一、概述 1、概念 == : 该操作符生成是一个boolean结果,它计算是操作数值之间关系 equals : Object 实例方法,比较两个对象content是否相同 hashCode...如果根据 equals(Object) 方法,两个对象是相等,那么对这两个对象中每个对象调用 hashCode 方法都必须生成相同整数结果。...如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中任一对象上调用 hashCode 方法 不要求 一定生成不同整数结果。...但是,程序员应该意识到,为不相等对象生成不同整数结果可以提高哈希表性能。   ...但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合元素比较次数就非常多了。

1.4K22

设计规则

默认情况下,仅使用用于生成应用程序程序集版本运行应用程序。...捕捉更具体异常,或者在执行 catch 块中最后一条语句时重新引发一般异常。 CA1032:实现标准异常构造函数 如果不能提供完整构造函数集,要正确处理异常将变得比较困难。...CA1036:重写可比较类型中方法 公共或受保护类型实现 System.IComparable 接口。 它不重写 Object.Equals,也不重载表示相等、不等、小于或大于语言特定运算符。...为一般用户进行设计库架构师不应指望用户能熟练运用 out 或 ref 参数。 CA1046:不要对引用类型重载相等运算符 对于引用类型,相等运算符默认实现几乎始终是正确。...默认情况下,仅当两个引用指向同一对象时,它们才相等。 CA1047:不要在密封类型中声明受保护成员 类型声明受保护成员,使继承类型可以访问或重写该成员

2K20

【c++】类和对象(五)赋值运算符重载

这个重载让你可以使用==来比较两个Date对象是否相等,即它们年、月、日是否都相同 关键点讲解 参数:operator==函数接受一个类型为const Date&参数d2,它是比较操作右侧操作数。...我们首先得把成员类型设置为公有的,发现还是报错, 原因:赋值运算符如果不显式实现,编译器会生成一个默认。...此时用户再在类外自己实现一个全局赋值运算符重载,就和编译器在类中生成默认赋值运算符重载冲突了,故赋值运算符重载只能是类成员函数 如果我们不写赋值运算符重载,编译器是否会默认生成呢?...注意:内置类型成员变量是直接赋值,而自定义类型成员变量需要调用对应类赋值运算符重载完成赋值 既然编译器生成默认赋值运算符重载函数已经可以完成字节序值拷贝了,还需要自己实现吗?...,我Date类型对象能否调用const成员函数呢?

14010

C++(STL):02---tuple容器

在C++11标准之前,tuple最多带有10个类型不同元素 C++11,tuple被重新定义,采用variadic template概念,被设计为可用于任意大小异质集合 二、tuple概述 tuple...1,1,0 },{2,2,0} }; //错误 std::tuple foo() { //错误 return{ 1,2,3 };} 也可以使用make_tuple()函数来生成一个...中成员数量 tuple_element:其接受一个索引和一个tuple类型,然后通过名为typepublic成员,表示给定tuple指定成员数据成员 //item类型为tuple<const char...STL容器比较规则: 如果两个容器具有相同大小且所有元素都两两对应相等,则两容器相等;否则不相等 如果两个容器大小不相同,但较小容器中每个元素都等于较大容器中对应元素,则较小容器小于较大容器 如果两个容器都不是另一个容器前缀子序列...,则它们比较结果取决于第一个不相等元素比较结果 tuple与STL容器比较规则类似,但是: 只有两个tuple具有相同数量成员时才可以进行比较 为了使用相等或不等运算符,对每对成员相等或不等运算符都必须是合法

1.1K20

程序员56大Java基础面试问题及答案

重载(Overload)和重写(Override)区别。重载方法能否根据返回类型进行区分? 26.Java四种引用 27....因为重写equals()里一般比较比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。...HashMap获取一个对象是比较keyhashCode相等和equals为true。...泛型即参数化类型,在创建集合时,指定集合元素类型,此集合只能传入该类型参数。 类型擦除:java编译器生成字节码不包含泛型信息,所以在编译时擦除:1.泛型用最顶级父类替换;2.移除。 33....因此比较常见static应用场景有: 1、修饰成员变量 2、修饰成员方法 3、静态代码块 4、修饰类【只能修饰内部类也就是静态内部类】 5、静态导包 47.break ,continue ,return

13720

对象、消息、运行期--8:对象等同性isEqual:、hash

对象等同性 对象等同性 :我们在使用对象时候,往往需要判断两个对象是否相等,这种相等包含两种含义: 在程序上是否是同一块内存地址 在语义上,是否能指代同一对象 NSString *str = @...比如我们要从数组中查找某个成员 step1:遍历数组中成员 step2:将取出值与目标值比较,如果相等,则返回该成员 这样查找比较复杂,为了提高查找速度,Hash Table出现了,当成员被加入到...Hash Table中时,会给它分配一个hash值,以标识该成员集合位置,分配这个hash值(即用于查找集合、数组中成员位置标识)就是通过hash算法计算出来,且hash方法返回hash值最好唯一..., 需要根据hash值来快速查找成员, 以保证集合中是否已经存在该成员 hash 值目的是尽最大可能返回一个标识,但并不是一定要是唯一。...根据 Person 设定,能标识 Person 是 name 和 age 属性,所以我们可以根据这两个属性来进行 hash 值生成

11710

java面试强基(5)

存储方式 :从变量在内存中存储方式来看,如果成员变量是使用 static 修饰,那么这个成员变量是属于类,如果没有使用 static 修饰,这个成员变量是属于实例。...生存时间 :从变量在内存中生存时间上看,成员变量是对象一部分,它随着对象创建而存在,而局部变量随着方法调用而自动生成,随着方法调用结束而消亡。...java中一般用于比较是值相等和引用相等。 值相等用equals(需要重写equals方法),单纯比较值;引用相等用==,用来比较引用地址和引用值。 对象相等和引用相等区别?...对象相等一般比较是内存中存放内容是否相等。 引用相等一般比较是他们指向内存地址是否相同。 类构造方法作用是什么?如果一个类没有声明构造方法,该程序能正确执行吗?...生成对象时自动执行,无需调用。 构造方法不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数情况。

32330

使用 Resharper 特性

本文告诉大家如何使用 Resharper 特性,在 VisualStudio 最好插件就是 Resharper 不过他比较卡。...因为 Resharper 无法修改编译所以他只能提示语法,不能告诉编译错误,使用下面的特性可以让Resharper提示开发者语法,一般在开发库就需要用到这些特性。...[CannotApplyEqualityOperator] public class DwdThfck 一般用在两个不能用来判断大小和相等类。...{ } CollectionAccessAttribute 表示函数是如何影响集合,一般用在继承几何方法 需要传入 CollectionAccessType ,里面可以使用值是...None 方法没有使用集合或没有影响 Read 方法只是读取集合 ModifyExistingContent 方法修改已有的元素 UpdatedContent 方法会修改集合

66020

C# - 为引用类型重定义相等

通常情况下引用类型相等性是不应该被重定义/重写。 例如两个引用类型变量 x 和 y,如果这样写:if(x == y) {...},那么大家都明白,这个比较是引用相等性。...实际上如果想比较两个应用类型里面的值是否相等,你不必非得去重写那些相等方法,你可以通过实现IEqualityComparer接口来写一个单独相等比较器。...这个采用了Resharper生成方法,以前说过,就不再介绍了。 最佳实践还要求重写C#==操作符: ? 当然配套!=也必须重写。...(resharper生成代码) 这个方法里使用了父类GetHashCode()方法,把它按位异或IdCardGetHashCode()结果。 然后实现==和!=操作符: ?...就是正确了。 所以说,相等性检查逻辑需要放在virtual方法里。 如果再往上一级,把参数都变成object类型: ? 输出结果是: ?

70920

Java集合详解【面试+工作】

因此出现了更好集合框架 一、数组和集合比较 数组不是面向对象,存在明显缺陷,集合弥补了数组缺点,比数组更灵活更实用,而且不同集合框架类可适用不同场合。...几种Set比较: HashSet外部无序地遍历成员成员可为任意Object子类对象,但如果覆盖了equals方法,同 时注意修改hashCode方法。...成员一般为同一类型。 LinkedHashSet外部按成员插入顺序遍历成员 成员与HashSet成员类似 HashSet是基于Hash算法实现,其性能通常都优于TreeSet。...当一个类有自己特有的“逻辑相等”概念(不同于对象身份概念); Object类仅仅提供了一个对引用比较,如果两个引用不是同一个那就返回false,这是无法满足大多数对象比较需要,所以要覆盖; 使用...==操作符检查实参是否为指向对象引用” 使用instanceof操作符检查实参是否为正确类型 把实参转换到正确类型; 对于该类中每一个“关键”域,检查实参中域与当前对象中对应域值是否匹 配。

1.9K60

面试涨薪攻略指南:Android面试必须掌握那些Java知识点

接口意义 泛型中extends和super区别 父类静态方法能否被子类重写 进程和线程区别 final,finally,finalize区别 序列化方式 Serializable 和Parcelable...列举java集合以及集合之间继承关系 集合类以及集合框架 容器类介绍以及之间区别(容器类估计很多人没听这个词,Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator...1、java中==和equals和hashCode区别 基本数据类型==比较相等。...(HashMap,HashSet等比较是否为同一个) 如果两个对象equals,Java运行时环境会认为他们hashcode一定相等。...如果两个对象不equals,他们hashcode有可能相等。 如果两个对象hashcode相等,他们不一定equals。 如果两个对象hashcode不相等,他们一定不equals。

48110

C#开发人员应该知道13件事情

编码标准 遵照编码标准可以编写出更多可维护代码,特别是在由多个开发人员或团队编写和维护代码库中。例如FxCop,StyleCop和ReSharper等,就是常用实施编码标准工具。...等价比较 有两种类型等价: 引用相等,这意味着两个引用,引用了同一个对象。 值平等,这意味着两个不同对象是等值。 此外,C#提供了多种方法来测试等价。最常见方法是使用: ==和!...C#编译器会警告你这个潜在错误,但是有许多类似的情况,编译器不会对意外引用相等发出警告。 3. 类陷阱 封装你数据 类负责正确地管理数据。...例如,暴露可变成员,如通用集合和数组,允许用户在你不知情情况下修改这些结构。 属性 属性使你能够精确控制用户如何与你对象进行交互,除了你通过访问修改器控制之外。...如果你假设不正确,编译器将抛出异常代码。例如,从对象到字符串转换。 转换指示编译器会生成关联表达式代码,如果没有生成,则会抛出异常。例如,从double到integer转换。

2.2K90

ReSharper 配置及用法

3: Resharper安装后,会做几件事情,这几件事情对于除此使用者,比较麻烦,因此归纳总结一下,以资参考。 (1)、会将选项——文本编辑器——C#——常规——自动列出成员 这个选择框勾选去掉。...Make Static,如果Resharper检测到这个方法并没有与非静态成员相关联的话,往往会自动地提示你(以黄色横杠形式出现)可以改为static,如果你自作主张对一些方法进行修改也无不妥,但后果自负...生成代码中最常用是构造函数和属性,当你没有私有字段时候,只会生成一个空默认构造函数,而且没有生成属性功能。...在你有私有字段情况下,生成之前会让你选择哪些私有字段需要作为构造函数参数,并生成初始化代码,这样编写重载极其方便。生成属性也类似。 再次常用就是重写基类或者接口方法了。...不是太常用生成Equals和GetHashCode方法,在我应用场景中很少重写它们。

1.7K10

linux cc++ 面试题目整理(五)

哪个成员函数用于从异常中获取错误信息? 直接捕捉值,捕捉用成员函数是catch。 5、std::string::find()返回类型是什么?...7、什么是const成员函数? const成员函数不允许修改类数据成员,只有被声明为const成员函数才能被一个const类对象调用。...8、请使用fabs和DBL_EPSILON写一个简单函数比较double dVal和0.45是否相等相等返回true,不等返回false; bool CheckDblEq(double dVal)...(1)请描述你解决这个问题思路;   (2)请给出主要处理流程,算法,以及算法复杂度   (3)请描述可能改进。 回答:   集合使用hash_set来表示,这样合并时间复杂度比较低。   ...遍历第二步中生成hash_map,对于每个value中链表,首先找到最小集合编号(有些集合已经被合并过,需要顺着合并关系数组找到合并后集合编号),然后将链表中所有编号集合都合并到编号最小集合

97820

代码质量规则

为一般群体设计库架构师不应指望用户能熟练运用 out 或 ref 参数。 CA1046:不要对引用类型重载相等运算符 对于引用类型,相等运算符默认实现几乎始终是正确。...默认情况下,仅当两个引用指向同一对象时,它们才相等。 CA1047:不要在密封类型中声明受保护成员 类型声明受保护成员,使继承类型可以访问或重写该成员。...CA1310:为了确保正确,请指定 StringComparison 字符串比较操作使用未设置 StringComparison 参数方法重载,并默认使用区域性特定字符串比较。...CA1815:重写值类型上 Equals 和相等运算符 对于值类型,Equals 继承实现使用反射库,并比较所有字段内容。 反射需要消耗大量计算资源,可能没有必要比较每一个字段是否相等。...CA2226:运算符应有对称重载 某个类型实现了相等运算符或不等运算符,却未实现相反运算符。 CA2227:集合属性应为只读 使用可写集合属性,用户可以将该集合替换为不同集合

2.1K30

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

原则1 尽可能地使用属性            而不是可直接访问数据成员 ● 属性(property)一直是C#语言中比较有特点存在。...GetHashCode()函数仅会在一个地方用到,即为基于散列(hash)集合定义键散列值时,此类集合包括HashSet和Dictionary容器等。...对值类型来讲,基类中实现有时甚至不正确。而且,编写自己GetHashCode( )也不可能既有效率又正确。...● 实现自己GetHashCode( )时,要遵循上述三条原则: 1)如果两个对象相等(由operation==定义),那么他们必须生成相同散列码。否则,这样散列码将无法用来查找容器中对象。...原则9 正确地初始化静态成员变量 ● C#提供了有静态初始化器和静态构造函数来专门用于静态成员变量初始化。

1.7K30
领券