程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#銳利體驗(四)(4)

C#銳利體驗(四)(4)

編輯:關於C語言

實例方法GetHashCode()為相應的類型提供哈希(hash)碼值,應用於哈希算法或哈希表中。需要注意的是如果我們重寫了某類型的實例方法Equals(object obj),我們也應該重寫實例方法GetHashCode()--這理所應當,兩個對象的值相等,它們的哈希碼也應該相等。下面的代碼是對前面幾個方法的一個很好的示例:

using System;
struct A
{
    public int count;
}
class B
{
    public int number;
}
class C
{
    public int integer=0;
    public override bool Equals(object obj)
    {
        C c=obj as C;
        if (c!=null)
            return this.integer==c.integer;
        else
            return false;
    }
    public override int GetHashCode()
    {
        return 2^integer;
    }
}
class Test
{
    public static void Main()
    {
        A a1,a2;
        a1.count=10;
        a2=a1;
//Console.Write(a1==a2);沒有定義“= =”操作符
        Console.Write(a1.Equals(a2));//True
Console.WriteLine(object.ReferenceEquals(a1,a2));//False
B b1=new B();
        B b2=new B();
b1.number=10;
        b2.number=10;
        Console.Write(b1==b2);//False
        Console.Write(b1.Equals(b2));//False
Console.WriteLine(object.ReferenceEquals(b1,b2));//False
b2=b1;
        Console.Write(b1==b2);//True
        Console.Write(b1.Equals(b2));//True
        Console.WriteLine(object.ReferenceEquals(b1,b2));//True
C c1=new C();
        C c2=new C();
c1.integer=10;
        c2.integer=10;
        Console.Write(c1==c2);//False
        Console.Write(c1.Equals(c2));//True
Console.WriteLine(object.ReferenceEquals(c1,c2));//False
c2=c1;
        Console.Write(c1==c2);//True
        Console.Write(c1.Equals(c2));//True
        Console.WriteLine(object.ReferenceEquals(c1,c2));//True
    }
}

如我們所期望,編譯程序並運行我們會得到以下輸出:

TrueFalse
FalseFalseFalse
TrueTrueTrue
FalseTrueFalse
TrueTrueTrue

實例方法GetType()與typeof的語義相同,它們都通過查詢對象的元數據來確定對象的運行時類型,我們在“第十講 特征與映射”對此作詳細的闡述。

實例方法ToString()返回對象的字符串表達形式。如果我們沒有重寫該方法,系統一般將類型名作為字符串返回。

受保護的Finalize()方法在C#中有特殊的語義,我們將在“第五講 構造器與析構器”裡詳細闡述。

受保護的MemberwiseClone()方法返回目前對象的一個“影子拷貝”,該方法不能被子類重寫。“影子拷貝”僅僅是對象的一份按位拷貝,其含義是對對象內的值類型變量進行賦值拷貝,對其內的引用類型變量進行句柄拷貝,也就是拷貝後的引用變量將持有對同一塊內存的引用。相對於“影子拷貝”的是深度拷貝,它對引用類型的變量進行的是值復制,而非句柄復制。例如X是一個含有對象A,B引用的對象,而對象A又含有對象M的引用。Y是X的一個“影子拷貝”。那麼Y將擁有同樣的A,B的引用。但對於X的一個“深度拷貝”Z來說,它將擁有對象C和D的引用,以及一個間接的對象N的引用,其中C是A的一份拷貝,D是B的一份拷貝,N是M的一份拷貝。深度拷貝在C#裡通過實現ICloneable接口(提供Clone()方法)來完成。

對對象和System.Object的把握為類的學習作了一個很好的鋪墊,但這僅僅是我們銳利之行的一小步,關乎對象成員初始化,內存引用的釋放,繼承與多態,異常處理等等諸多“Sharp”特技堪為浩瀚,讓我們繼續期待下面的專題!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved