什麽時候需要覆蓋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相關的一些要點的更多相关文章

  1. 【转】編譯Ogre1.9 IOS Dependencies及Ogre Source步驟及相關注意事項…

    http://makedreamvsogre.blogspot.tw/2014/01/ios-dependenciesogre-source.html 可能有人會想問我為什麼要自行編譯IOS Depe ...

  2. D2GS1.11 的DC Key的相關設置指南

    D2GS1.11版本暗黑戰網服務器DC Key 的相關設置是保存在 D2Server.ini 文件中的.在這裡我列舉跟DC Key 有關的配置條款. (以下內容具存在於D2Server.ini 文件中 ...

  3. Iptables網路連線限制及攻擊防護和相關設定

    [筆記整理]Iptables網路連線限制及攻擊防護和相關設定 1. 限制每個IP連接HTTP最大併發50個連接數 iptables -A INPUT -p tcp --dport 80 -m conn ...

  4. Ubuntu IntelliJ IDEA 注冊碼與Gradle相關

    一.Ubuntu IntelliJ IDEA 注冊碼 在线免费生成IntelliJ IDEA 15.0(16.+)注册码 注冊參考:https://www.iteblog.com/idea/ 依次选择 ...

  5. CSS| 框模型-定位及相關屬性

    CSS 定位 (Positioning) 属性允许你对元素进行定位. CSS 定位和浮动 CSS 为定位和浮动提供了一些属性,利用这些属性,可以建立列式布局,将布局的一部分与另一部分重叠,还可以完成多 ...

  6. 修改手機的 input source 及 charger 及 usb 相關電路後,容易忽略的事項

    input source 及 charger 需要注意, 是否可以在關機的狀況下充電, 當然 開機充電 是一定要的. usb 部分需要注意, 是否可以在沒有電或者是有電的狀況下 download 程式 ...

  7. apt-get 相關設定

    /etc/apt/apt.conf.d/01proxy 若加了以下這行,則 apt-get 都會透過下方網址get Acquire::http::Proxy "http://aptcache ...

  8. power key 啟動系統的相關電路

    Platform Qualcomm MSM8917 / 37 + PM8937(main PMIC) + PMI8940 Schematic Principles 當 power key 按下時, K ...

  9. 我個人喜歡的一些Ubuntu的相關配置

    1.vim vim安裝: sudo apt-get install vim-gtk vim美化:刚安装的VIM,可能界面并不是十分友好,我们可以更改vim的配置文件,按照我们的需求去修改它.在命令行下 ...

随机推荐

  1. python 未知

    import timeimport requestsfrom bs4 import BeautifulSoupimport threading def format_str(s): return s. ...

  2. net core 配置Redis Cache

    参考文章地址:https://dotnetcoretutorials.com/2017/01/06/using-redis-cache-net-core/ 具体步骤: 1   Install-Pack ...

  3. 【codeforces 797E】Array Queries

    [题目链接]:http://codeforces.com/problemset/problem/797/E [题意] 给你一个n个元素的数组; 每个元素都在1..n之间; 然后给你q个询问; 每个询问 ...

  4. Codeforces Round #400 (Div. 1 + Div. 2, combined)——ABCDE

    题目戳这里 A.A Serial Killer 题目描述似乎很恶心,结合样例和样例解释猜测的题意 使用C++11的auto可以来一手骚操作 #include <bits/stdc++.h> ...

  5. web开发如何使用高德地图API(四)通过AMap.Marker自定义标点

    说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...

  6. bx值

    bx值 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem De ...

  7. POJ - 3538 - Domestic Networks

    先上题目: Domestic Networks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 732   Accepted: ...

  8. nyoj_66_分数拆分_201312012122

    分数拆分 时间限制:3000 ms  |           内存限制:65535 KB 难度:1   描述 现在输入一个正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y.   输 ...

  9. nyoj_102_次方求模_201308221547

    次方求模时间限制:1000 ms  |  内存限制:65535 KB 难度:3描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100)每组测试只有一行,其中有三 ...

  10. .NET Web API - 去掉讨厌的$id并且强制返回json格式

    // 只返回json字符串,屏蔽自动选择xml格式的可能性,同时去掉讨厌的$id var json = config.Formatters.JsonFormatter; json.Serializer ...