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 IR和C/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內存異常 (jetty和tomcat哪個更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