[转载] 什么时候应该使用 ==?什么时候应该使用 Equals?
Equals 方法只是在 System.Object 中定義的一個虛擬方法,它由任何選擇執行該任務的類所重寫。== 運算符是一個可由類重載的運算符,該類通常具有恒等行為。
對于未重載 == 的引用類型,該運算符會比較兩個引用類型是否引用同一對象,而這恰好是 System.Object 中的 Equals 實現所做的工作。
對于未重載 == 的值類型,該運算符會比較這兩個值是否"按位"相等,即是否這兩個值中的每個字段都相等。當您對值類型調用 Equals 時,仍然會發生這一情況,但這一次,該實現是由 ValueType 提供的,并且使用反射進行比較,從而使比較速度比特定于類型的實現慢很多。
到此為止,二者是如此類似。二者之間的主要區別是多態。運算符被重載而不是被重寫,這意味著除非編譯器知道調用更為具體的版本,否則它只是調用恒等版本。為闡明這一點,請看下面這個示例:
public?class?Test
{
static?void?Main()
{
????????//?Create?two?equal?but?distinct?strings
????????string?a?=?new?string(new?char[]?{'h',?'e',?'l',?'l',?'o'});
????????string?b?=?new?string(new?char[]?{'h',?'e',?'l',?'l',?'o'});
????????Console.WriteLine?(a==b);
????????Console.WriteLine?(a.Equals(b));
????????//?Now?let's?see?what?happens?with?the?same?tests?but
????????//?with?variables?of?type?object
????????object?c?=?a;
????????object?d?=?b;
????????Console.WriteLine?(c==d);
????????Console.WriteLine?(c.Equals(d));
????}
}
結果是:
True
True
False
True
第三行是 False,原因在于編譯器不知道 c 和 d 的內容都是字符串引用,因而只能調用 == 的非重載版本。因為它們是對不同字符串的引用,所以恒等運算符返回 False。
那么,應該如何區別使用這些運算符呢?我的準則是:對于幾乎所有引用類型,當您希望測試相等性而不是引用一致性時,請使用 Equals。例外的情況是字符串 - 使用 == 比較字符串確實會使事情簡單得多,而且代碼可讀性更好,但是 您需要記住,該運算符的兩端都必須是類型字符串表達式,才能使比較正常進行。
對于值類型,我通常使用 ==,因為除非值類型本身包含引用類型(這種情況極為罕見),否則是恒等還是相等的問題無關緊要。
[作者:Jon Skeet]
轉載于:https://www.cnblogs.com/chinadhf/archive/2006/01/01/309390.html
總結
以上是生活随笔為你收集整理的[转载] 什么时候应该使用 ==?什么时候应该使用 Equals?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 元旦是星期天,春节是1.29,也是星期天
- 下一篇: Virtual Machine--Vmw