日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

.net框架读书笔记---通用对象操作(一)

發布時間:2024/1/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net框架读书笔记---通用对象操作(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接上一篇.net框架讀書筆記---基礎類型,這節主要學習這樣正確實現所有對象都必須提供的一組通用操作---對象的等值性和唯一性;

  System.Object類型提供了一個名為Equals的虛方法,其目的為判斷兩個對象是否具有相同的”值“,因為每個類型都繼承自Object,所以我們可以保證每個類型的實例都有這樣的Equals方法。對于那些沒有顯式重寫Equals方法的類型,Object提供的實現將被繼承,下面代碼展示了System.Object類型中的Equals方法實現:

代碼   class Object
{
public virtual bool Equals(object obj)
{
//如果兩個引用指向同一個對象
//它們肯定相等
if (this == obj)
{
return true;
}

//假定兩個對象不相等
return false;
}
}

該方法采取的策略可能是最簡單的:如果進行比較的兩個引用指向的是同一個對象,方法將返回true;否則返回false,如果我們定義自己的類型,并且希望比較它們中的字段是否相等,Object類型提供的默認實現對我們來說是不夠的,我們必須重寫Equals方法,提供自己的實現,

  當實現自己的Equals方法時,我們必須確保它遵循以下4條規則:

  • Equals方法必須是自反的,就是說,x.Equals(x)必須返回true;
  • Equals方法必須是對稱的,就是說,x.Equals(y)和y.Equals(x)必須返回同樣的值;
  • Equals方法必須是可傳遞的,就是說,x.Equals(y)和y.Equals(z)都返回true,那么x.Equals(z)也必須返回true;
  • Equals方法必須是前后一致的,就是說,如果兩個對象的值沒有發生變化,那么多次調用Equals方法的返回值應該相同;

如果沒有遵守上述4條規則,那么將會產生一些不可預期的行為。

一、為基類沒有重寫Object.Equals方法的引用類型實現Equals

  對于那些基類型直接繼承了Object.Equals實現的類型,下面代碼展示了怎樣為它們實現Equals方法:

?

代碼
//引用類型
class RefType
{
}

//值類型
struct ValType
{
}

//基類型
class BaseType
{
}
class MyRefType : BaseType
{
RefType refObj;
ValType valObj;

public override bool Equals(object obj)
{
//因為this不為null,如果obj為null,那么兩個對象將不可能相等
if (obj == null)
{
return false;
}

//如果兩個對象的類型不同,那么他們不可能相等
if (this.GetType() != obj.GetType())
{
return false;
}

//將obj轉型為定義的類型以訪問其中的字段,該轉型不會失敗,因為已經知道兩個對象是同一個類型
MyRefType other = (MyRefType)obj;

//比較其中的引用類型字段
if(!object.Equals(refObj,other.refObj))
{
return false;
}

//比較其中的值類型字段
if (!valObj.Equals(other.valObj))
{
return false;
}

return true;//到這里才算兩個對象相等
}

//重載==和!=操作符(可選)
public static bool operator ==(MyRefType o1, MyRefType o2)
{
return object.Equals(o1, o2);
}

public static bool operator !=(MyRefType o1, MyRefType o2)
{
return !(o1 == o2);
}
}

這里實現的Equals首先將obj和null比較。如果被比較對象不為null,那么將比較兩個對象的類型,如果類型系統將轉型為MyRefType,這里轉型不可能拋出異常,因為我們已經知道兩個對象為同一個類型。等以上所有步驟完畢,我們才開始比較兩個對象中的字段,如果字段都相等,那么返回true。

  前面的代碼展示了根據字段類型的不同,所進行的兩種不同的比較方式。

  • 比較引用類型字段,要比較引用類型的字段,我們應該調用object的靜態equals方法。object的靜態Equals方法是一個比較兩個引用類型對象的輔助方法。下面展示了object的靜態Equals方法的內部實現: 代碼 public static bool Equals(object objA, object objB)
    {
    //如果objA和objB指向同一個對象,方法返回true
    if (objA == objB)
    {
    return true;
    }

    //如果objA或者objB為null,它們不可能相等,方法返回false
    if((objA==null)||(objB==null))
    {
    return false;
    }

    //判斷objA和objB是否相等,返回比較結果
    return objA.Equals(objB);
    }

    ?

   采用這種方法來比較引用類型字段是因為即使兩個字段出現了值為null的情況,我們的代碼仍會正常運行,例如refobj        ?????? 為null,調用refobj.Equals(other.refobj)將會拋出NullReferenceException異常。object的靜態Equals這一輔助 方法會為我們對null的情況做正確的檢測。 

  • 比較值類型字段,要比較兩個值類型字段,我們應該調用該字段的類型的Equals方法來比較它們。我們不應該調用object的靜態Equals方法,因為值類型對象的值永遠不會為null,并且調用object的靜態Equals方法會對值類型進行對象裝箱操作。

二、為基類重寫了Object.Equals方法的引用類型實現Equals方法

  對于那些基類型提供了非Object.Equals方法實現的應用類型(基類有過重寫),看下面代碼:

?

代碼
//引用類型
class RefType
{
}

//值類型
struct ValType
{
}

//基類型
class BaseType
{
}
class MyRefType : BaseType
{
RefType refObj;
ValType valObj;

public override bool Equals(object obj)
{
//首先讓基類型比較其中的字段
if (base.Equals(obj))
{
return false;
}
//因為this不為null,如果obj為null,那么兩個對象將不可能相等
if (obj == null)
{
return false;
}

//如果兩個對象的類型不同,那么他們不可能相等
if (this.GetType() != obj.GetType())
{
return false;
}

//將obj轉型為定義的類型以訪問其中的字段,該轉型不會失敗,因為已經知道兩個對象是同一個類型
MyRefType other = (MyRefType)obj;

//比較其中的引用類型字段
if(!object.Equals(refObj,other.refObj))
{
return false;
}

//比較其中的值類型字段
if (!valObj.Equals(other.valObj))
{
return false;
}

return true;//到這里才算兩個對象相等
}

//重載==和!=操作符(可選)
public static bool operator ==(MyRefType o1, MyRefType o2)
{
return object.Equals(o1, o2);
}

public static bool operator !=(MyRefType o1, MyRefType o2)
{
return !(o1 == o2);
}

}

?

?

 這段代碼和前面的代碼唯一差別是這里還要求比較基類中的定義的字段,如果基類型認為不相等,那么他們不可能相等。

  如果調用base.Equals會導致調用Object.Equals方法,那么就不應該再調用它,這一點很重要。因為只有在兩個指向同一個對象時,Object.Equals方法才會返回true。如果兩個引用沒有指向同一個對象,那么它將返回false,這樣我們實現的Equals方法將總會返回false!

  當然。如果我們定義的類型直接繼承自object,我們就應該像前面一樣來實現Equals。如果我們定義的類型不是直接繼承自object,我們必須首先確定該類型的基類型(除object類型之外的基類型)是否重寫了Equals方法。如果基類型重寫了Equals方法,那么首先應該向上例一樣調用base .Equals方法。

三、為值類型實現Equals方法

待續。。。。。。。。。。。。

轉載于:https://www.cnblogs.com/sanjia/archive/2010/04/05/1704629.html

總結

以上是生活随笔為你收集整理的.net框架读书笔记---通用对象操作(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。