1. 程式人生 > >C#過載操作符==和!=時注意問題

C#過載操作符==和!=時注意問題

public class MyClass
{
	public int ID;


    /*public static bool operator ==(MyClass c1, MyClass c2)
    {
        //下面這段程式碼中的“==”呼叫會進入遞迴,直至崩潰
        if (c1 == null || c2 == null)
        {
            return c1 == c2;
        }


        return c1.ID == c2.ID;
    }


    public static bool operator !=(MyClass c1, MyClass c2)
    {
        //下面這段程式碼中的“==”呼叫會進入遞迴,直至崩潰
        if (c1 == null || c2 == null)
        {
            return c1 != c2;
        }


        return c1.ID != c2.ID;
    }*/
    
    //正確的方法
    public static bool operator ==(MyClass c1, MyClass c2)
    {
        //將c1物件轉為object再進行判斷
        //這裡的object.Equals(c1, null)也可以寫成
        //c1 as object == null
        if (object.Equals(c1, null) || object.Equals(c2, null))
        {
            return object.Equals(c1, c2);
        }


        return c1.ID == c2.ID;
    }


    public static bool operator !=(MyClass c1, MyClass c2)
    {
        if (object.Equals(c1, null) || object.Equals(c2, null))
        {
            return !object.Equals(c1, c2);
        }


        return c1.ID != c2.ID;
    }
}

參考:http://www.cnblogs.com/cruisoring/archive/2009/11/04/1595958.html

相關推薦

C#過載操作符==!=注意問題

public class MyClass { public int ID; /*public static bool operator ==(MyClass c1, MyClass c

淺析c#中==操作符equals方法

邏輯 mce 需求 ram margin width 通過 否則 可用   在之前的文章中,我們講到了使用C#中提供的Object類的虛Equals方法來判斷Equality,但實際上它還提供了另外一種判斷Equality的方法,那就是使用==運算符。許多童鞋也許會想當然的

C++ 過載運算子過載函式

前言:     運算子過載和函式過載體現了面向物件技術的多型性。多型性機制不僅增加了面向物件軟體系統的靈活性,進一步減少了冗餘資訊,而且顯著提高了軟體的可重用性和可擴充性。     從實現的角度來講,多型性可以劃分為兩類:編譯時的多型性和執行時的多型性。在C+

C語言操作符表示式

目錄 一、操作符 C語言操作符的一些需要注意的坑。 二、表示式 問題表示式問題在哪裡。 正文 一、操作符 算數操作符 + - * / % 注意點 除了%操作符外,其他的幾個算數操作

c/c++ 過載運算子 ==!=的過載

過載運算子 ==和!=的過載 問題:假如有一個類似於vector的類,這個類只能存放string,當有2個這個類的物件時,如何比較這2個物件。 自己過載==和!= 程式碼(過載==,!=) #include <iostream> #include <memory> #inclu

C++過載操作符之二(輸入>>,輸出

#include<iostream> using namespace std; class Rational { private: int numerator; int denom

C++過載覆蓋隱藏,虛擬函式與純虛擬函式

這幾個概念都有一個共同點:函式名稱相同,所以不免讓人混淆,大致的區別如下:過載(overload):必須在一個域中,函式名稱相同但是函式引數不同,過載的作用就是同一個函式有不同的行為,因此不是在一個域中的函式是無法構成過載的,這個是過載的重要特徵覆蓋(override):覆

C++ 過載操作符 operator

引數個數的限定 非成員函式:   單目運算子:引數表中只有一個引數;   雙目運算子:引數表中只有兩個引數       成員函式:   單目運算子:引數表中沒有引數;   雙目運算子:引數表中只有一個引數 operator是C++的關鍵字,它和運算子一起使用,表示

C++中點操作符箭頭操作符的區別

/* * "."與"->"的區別 * "."的左邊必須是結構體名/物件名的實體 * "->":的左邊必須是結構體名/物件名的指標 * 輸出:輸入年月日時分秒,並且輸出,輸出形式為年/月/日

C++過載操作符的函式定義 詳細解讀

過載操作符的函式定義為什麼一定是如下的形式呢? ostream & operator << (ostream & output, const ClassType & object) { output <<

C++點操作符箭頭操作符

相同點:兩個都是二元操作符,其右操作符是成員的名稱。  主要看左邊的操作符,左邊是指標用箭頭,否則用點操作符 不同點:點操作符左邊的運算元是一個“結果為結構”的表示式;                 箭頭操作符左邊的運算元是一個指向結構的指標。 首先介紹一下C

LLVM IRC/C++函式相互呼叫注意事項

已下敘述,主要針對LLVM 3.6。 一、從C/C++呼叫LLVM IR函式 主要有兩種辦法。 1、通過llvm::ExecutionEngine::runFunction()呼叫。     存在的問

C++主要操作符重載的定義總結

例子 編寫 操作符 功能 邏輯 大小 lin 進行 私有 C++中預定義的運算符的操作對象只能是基本數據類型,實際上,對於很多用戶自定義類型,也需要有類似的運算操作。例如: class complex { public: complex(double r=0.0,do

C# new關鍵字對象類型轉換(雙括號、is操作符、as操作符)

對象 分配 key system.in let main false ring true 一、new關鍵字 CLR要求所有的對象都通過new來創建,代碼如下: Object obj=new Object(); 以下是new操作符做的事情 1、計算類型及其所有基類型(一直

C#連接solr提示 java內存異常 (jettytomcat哪個更High) java.lang.OutOfMemoryError

lan ips pso title sele 提示 eth score apache C#連接solr時提示 java內存異常 java.lang.OutOfMemoryError 時間:20180130 09:51:13.329,消息:異常消息<?xml

[C指標] 4-語句、5-操作符表示式、6-指標

第4章 語句 4.1 表示式語句 C並不存在專門的“賦值語句”,賦值就是一種操作,就像加法和減法一樣,所以賦值就在表示式內進行。 你只要在表示式後面加上一個分號,就可以把表示式轉變成語句。所以下面這兩個表示式實際上是表示式語句,而不是賦值語句。 x = y + 3; ch = getchar();

C++過載(2):通過成員函式友元函式過載

分別通過成員函式和友元函式完成過載 #include <iostream> using namespace std; class Complex { public: Complex(double real =0,double imag=0):real(real),imag(i

C++Primer_Chap16_模板泛型程式設計_List03_過載模板_筆記

  函式模板可以被另一個模板或普通非模板函式過載。與往常一樣,名字相同的函式必須具有不同數量和型別的引數。涉及函式模板,函式匹配規則會在以下幾方面受到影響: 對於一個呼叫,其候選函式包括所有模板實參推斷成功的函式模板例項 候選的函式模板總是可行的,因為模板實參推斷會排除任何

C++的操作符過載

一、操作符標記和操作符函式 1、雙目操作符:L#R 成員函式形式:L.operator# (R) —— 左調右參 全域性函式形式:::operator#(L,R) —— 左一右二 2、單目操作符:#O/O# 成員函式形式:O.operator#() 全域性函式形式:::o

c++過載string類的左移操作符

過載操作符有兩個引數,左邊的引數是steam類的引數,右邊是要進行操作的類的物件,在這裡用string類舉一個例子 #include <iostream> #include <string> using namespace std; ostream & opera