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的配置文件,按照我们的需求去修改它.在命令行下 ...
随机推荐
- Linux - redis哨兵集群实例
目录 Linux - redis哨兵集群实例 命令整理 配置流程 Linux - redis哨兵集群实例 命令整理 官网地址:http://redisdoc.com/ redis-cli info # ...
- 绿色地址栏扩展验证(EV)SSL证书、支持SGC 强制最低128位
Pro With EV SSL证书,最严格的域名所有权和企业身份信息验证,属于最高信任级别.最高安全级别的 EV SSL证书,该证书可以使地址栏变成高安全绿色,并且在地址栏内显示您公司的名称,提高 ...
- 清北学堂模拟赛d1t5 拍照(photo)
题目描述 假设这是一个二次元.LYK召集了n个小伙伴一起来拍照.他们分别有自己的身高Hi和宽度Wi.为了放下这个照片并且每个小伙伴都完整的露出来,必须需要一个宽度为ΣWi,长度为max{Hi}的相框. ...
- [NOIP2016day2T1] 組合數問題(problem)
题目描述 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们 ...
- static 语句块
static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,stati ...
- Linux imooc learning
https://www.imooc.com/video/3529 Windows Vs Linux Linux: (other linux overall https://onedrive.liv ...
- kendo grid结合ajax功能
我感觉使用ajax结合表格绑定效率更好一些,可以灵活的控制点击前后的事件,现在grid前后的事件我不能控制
- [poj2417]Discrete Logging_BSGS
Discrete Logging poj-2417 题目大意:求$a^x\equiv b(mod\qquad c)$ 注释:O(分块可过) 想法:介绍一种算法BSGS(Baby-Step Giant- ...
- natural join 以及 v$statname , v$sessstat
oracle natural join是一个比较方便的用法.如果两个表的某些字段名称相同,类型相同,natural join就会把他们做等值连接.比如下面我们知道这两个视图的结构如下: SQL> ...
- tp 中一个字段写两个表达式的写法
$maps['deadline'] = array(array('gt',0),array('elt',$endTime), 'and');