Equals相關的一些要點
什麽時候需要覆蓋Equals?
自定義的值類型需要覆蓋,因爲框架默認的實現是基於反射的,效率不高。
自定義的引用類型要根據業務需要來決定是否提供覆蓋。
什麽時候需要覆蓋operator==()?
自定義的值類型需要覆蓋,原因和Equals一樣。
自定義的引用類型一般不要覆蓋,因爲框架的默認語義是按引用比較。
如何正確的覆蓋Equals?
首先覆蓋Equals的同時還要覆蓋GetHashCode ,爲了確保唯一,可以使用System.Runtime.CompilerServices.RuntimeHelpers類的GetHashCode方法,它能夠返回AppDomain範圍内一個唯一ID
其次還要實現IEquatable<T>接口,該接口實現類型安全的比較
所以基本上一個標準實現如下:
class Foo : IEquatable<Foo>
{
public override int GetHashCode()
{
//add logic here...
} public override bool Equals(object obj)
{
if (obj == null) return false; if (object.ReferenceEquals(this, obj)) return true; if (this.GetType() != obj.GetType()) return false; return this.Equals(obj as Foo);
} public bool Equals(Foo other)
{
//add logic here...
}
}
什麽時候需要實現IStructuralEquatable?
自定義的集合對象或者組合對象可以考慮實現該接口,以實現基於内容的比較。
框架默認爲數組和元組提供了該接口的實現,這樣就不會衹按引用比較,而是按内部元素的值進行比較。
編譯器爲匿名類型重寫了Equal方法,所以用Equal比較兩個相同的匿名對象會得到true;
但直接用==比較則得到false,因爲默認==是按引用來比較的,而匿名類型是不可能重載==
Equals相關的一些要點的更多相关文章
- 【转】編譯Ogre1.9 IOS Dependencies及Ogre Source步驟及相關注意事項…
http://makedreamvsogre.blogspot.tw/2014/01/ios-dependenciesogre-source.html 可能有人會想問我為什麼要自行編譯IOS Depe ...
- D2GS1.11 的DC Key的相關設置指南
D2GS1.11版本暗黑戰網服務器DC Key 的相關設置是保存在 D2Server.ini 文件中的.在這裡我列舉跟DC Key 有關的配置條款. (以下內容具存在於D2Server.ini 文件中 ...
- Iptables網路連線限制及攻擊防護和相關設定
[筆記整理]Iptables網路連線限制及攻擊防護和相關設定 1. 限制每個IP連接HTTP最大併發50個連接數 iptables -A INPUT -p tcp --dport 80 -m conn ...
- Ubuntu IntelliJ IDEA 注冊碼與Gradle相關
一.Ubuntu IntelliJ IDEA 注冊碼 在线免费生成IntelliJ IDEA 15.0(16.+)注册码 注冊參考:https://www.iteblog.com/idea/ 依次选择 ...
- CSS| 框模型-定位及相關屬性
CSS 定位 (Positioning) 属性允许你对元素进行定位. CSS 定位和浮动 CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多 ...
- 修改手機的 input source 及 charger 及 usb 相關電路後,容易忽略的事項
input source 及 charger 需要注意, 是否可以在關機的狀況下充電, 當然 開機充電 是一定要的. usb 部分需要注意, 是否可以在沒有電或者是有電的狀況下 download 程式 ...
- apt-get 相關設定
/etc/apt/apt.conf.d/01proxy 若加了以下這行,則 apt-get 都會透過下方網址get Acquire::http::Proxy "http://aptcache ...
- power key 啟動系統的相關電路
Platform Qualcomm MSM8917 / 37 + PM8937(main PMIC) + PMI8940 Schematic Principles 當 power key 按下時, K ...
- 我個人喜歡的一些Ubuntu的相關配置
1.vim vim安裝: sudo apt-get install vim-gtk vim美化:刚安装的VIM,可能界面并不是十分友好,我们可以更改vim的配置文件,按照我们的需求去修改它.在命令行下 ...
随机推荐
- 6.3.2 使用struct模块读写二进制文件
使用 struct 模块需要使用 pack() 方法吧对象按指定个数进行序列化,然后使用文件对象的write方法将序列化的结果写入二进制文件:读取时需要使用文件对象的read()方法读取二进制文件内容 ...
- Beetl学习总结(2)——基本用法
2.1. 安装 如果使用maven,使用如下坐标 <dependency> <groupId>com.ibeetl</groupId> <artifactId ...
- 2.1.4、SparkEnv中创建BroadcastManager
Broadcast是分布式的数据共享,由BroadcastManager负责管理其创建或销毁.Broadcast一般用于处理共享的配置文件.通用Dataset.常用数据结构 通过SparkContex ...
- 混合了RBAC和ACL的权限系统(二) -- 基于RBAC的系统权限
http://fightplane.iteye.com/blog/1278464 1. 概念说明 A 系统级权限:从角色的角度出发,不特定于任何实际的资源的权限.比如“用户是否可以修改标题”这个权限, ...
- Aggressive Cows 二分
Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are locat ...
- window7 查找与杀掉占用端口的进程
1.netstat -ano | findstr 3000 2.tasklist | findstr pid 3. taskkill -f -t -im 进程名
- mongodb之安装
前言 系统环境是CentOS,linux只支持64位版本 yum源安装 rpm包说明 mongodb-org-server 包含mongod进程,关联配置,初始化脚本mongodb-org-mongo ...
- HDU 5016 Mart Master II (树上点分治)
题目地址:pid=5016">HDU 5016 先两遍DFS预处理出每一个点距近期的基站的距离与基站的编号. 然后找重心.求出每一个点距重心的距离.然后依据dis[x]+dis[y] ...
- 中国银联mPOS通用技术安全分析和规范解读
mPOS是近年出现并得到迅速发展的一种新型受理产品,不少机构和生产企业进行了各种形式的试点. 因为mPOS引入了手机.平板电脑等通用智能移动设备.并通过互联网进行信息传输.因此其安全特点与传统银行卡受 ...
- CSS之实现二级菜单动态出现
一直觉得二级菜单的出现效果仅仅有js才干控制.今天研究了一下阿里巴巴站点的首页,才发现,原来二级菜单的动态显示也能够使用CSS来控制,原来对CSS是静态的东西一直是误解它了,CSS也能够实现动态的效果 ...