C# 相等运算
1.?public static bool ReferenceEquals(object left, object right)
Object.ReferenceEquals()在兩個變量引用到同一個對象時返回true,也就是兩個變量具有相同的對象ID。不管比較的類型是引用類型還是值類型的,這個方法總是檢測對象ID,而不是對象內容。
string a = "test"; string b = "test"; if (Object.ReferenceEquals(a, b)) {Console.WriteLine("equal"); } else {Console.WriteLine("not equal"); } //equal當比對兩個值類型的時候,Object.ReferenceEquals返回false,即使比較的是同一個值類型對象,也會返回false,因為Object.ReferenceEquals輸入的兩個參數是object類型,所以需要對兩個值類型的參數進行裝箱操作,導致兩個對象的ID不同。
int i = 5; int j = 5; if (Object.ReferenceEquals(i, j)) {Console.WriteLine("equal"); } else {Console.WriteLine("not equal"); } //not equalif (Object.ReferenceEquals(i, i)) {Console.WriteLine("ReferenceEquals : equal"); } else {Console.WriteLine("ReferenceEquals : not equal"); } //not equal2.public virtual bool Equals(object right)
Object.Equals()方法使用對象的ID來斷定兩個變量是否相等。這個默認的Object.Equals()函數的行為與Object.ReferenceEquals()是一樣的。但是請注意,值類型是不一樣的。System.ValueType并沒有重載Object.Equals(),記住,System.ValueType是所有你所創建的值類型(使用關鍵字struct創建)的基類。兩個值類型的變量相等的前提條件是它們的類型和內容都是一樣的。ValueType.Equals()實現了這一行為。不幸的是,ValueType.Equals()并不是一個高效的實現。ValueType.Equals()是所有值類型的基類(譯注:這里是說這個方法在基類上進行比較)。為了提供正確的行為,它必須比較派生類的所有成員變量,而且是在不知道派生類的類型的情況下。在C#里,這就意味著要使用反射。對反射而言它們有太多的不利之處,特別是在以性能為目標的時候。
當你想改變引用類型默認的Equals()語義試,建議重載Equ()方法。
你必須確保你重新定義的方法能滿足數學相等性質:相等的自反性,對稱性和傳遞性。自反性就是說一個對象是等于它自己的,不管對于什么類型,a==a總應該返回true;對稱就是說,如果有a==b為真,那么b==a也必須為真;傳遞性就是說,如果a==b為真,且b==c也為真,那么a==c也必須為真,這就是傳遞性。
標準模式:
public class Foo {public override bool Equals(object right){// check null:// the this pointer is never null in C# methods.if (right == null)return false;if (object.ReferenceEquals(this, right))return true;// Discussed below.if (this.GetType() != right.GetType())return false;// Compare this type's contents here:return CompareFooMembers(this, right as Foo);}private static bool CompareFooMembers(Foo f, Foo b){//do } }3.== 操作符
?任何時候你創建一個值類型,重新定義操作符==()。原因和實例的Equals()是完全一樣的。默認的版本使用的是引用的比較來比較兩個值類型。
4.public static bool Equals(object left, object right);
靜態的Object.Equals()方法是像下面這樣實現的:
public static bool Equals(object left, object right) {// Check object identityif (left == right)return true;// both null references handled aboveif ((left == null) || (right == null))return false;return left.Equals (right); }靜態的Equals()是使用左邊參數實例的Equals()方法來斷定兩個對象是否相等。
?
總結
你應該為了更好的性能而總是為值類型實例提供重載的Equals()方法和操作符==()。當你希望引用類型的相等與對象ID的相等不同時,你應該重載引用類型實例的Equals()。
?
轉載于:https://www.cnblogs.com/xanadu123/p/5034405.html
總結
- 上一篇: 锋利的JQuery —— DOM操作
- 下一篇: FreeSwitch安装和配置记录