在C和C++程序員看來,指針既是他們最強有力的工具之一,同時又給他們帶來了很多苦惱之處。因為指針指向的數據類型可能並不相同,比如你可以把int類型的指針指向一個float類型的變量,而這時程序並不會出錯。而且,如果你刪除了一個不應該被刪除的指針(比如Windows中指向主程序的指針),程序就有可能崩潰。由此可見,濫用指針給程序的安全性埋下了隱患。
正因為如此,在C#語言中取消了指針這個概念。當然,對指針戀戀不捨的程序員仍然可以在C#中使用指針,但必須聲明這段程序是“非安全(unsafe)”的。而我們在這裡要介紹的是C#的一個引用類型--代表(delegate)。它實際上相當於C#中的函數指針原型。與指針不同的是,代表在C#是類型安全的。
在聲明代表時,只需要指定代表指向的原型的類型,它不能有返回值,也不能帶有輸出類型的參數。比如我們可以聲明一個指向int類型函數原型的代表:
delegate int MyDelegate();
如果我們聲明了一個自己的代表,那麼它就是對系統定義的類System.delegate的一個擴展。在代表的實例中,我們可以封裝一個靜態方法,也可以封裝一個非靜態的方法。我們看下面的例子:
程序清單4-2:
using System; delegate int MyDelegate(); //聲明一個代表 public class MyClass { public int InstanceMethod(){ console.WriteLine("Call the instance method."); return 0; } static public int StaticMethod(){ Console.WriteLine("Call the static method."); return 0; } } public class Test { static public void Main() { MyClass p=new MyClass(); //將代表指向非靜態的方法 InstanceMethod MyDelegate d=new MyDelegate(p.InstanceMethod); //調用非靜態方法 d(); //將代表指向靜態的方法StaticMethod d=new MyDelegate(MyClass.StaticMethod); //調用靜態方法 d(); } } 程序的輸出結果是: call the instance method. call the static method.