代表元是C#中比較復雜的概念,C#中的代表元和C/C++中的函數指針非常相似使用代表元可以把代表元內部方法的引用封裝起來然後通過它使用代表元引用的方法。
它有一個特性就是不需要知道被引用的方法屬於那一個類對象只要函數的參數個數與返回類型與代表元對象一致。這樣說可能比較抽象我下面舉幾個簡單的例子希望能給廣大初學者一些基本的認識。
//定義一個返回值為string的無參數的代表元
注意這個代表元只能引用對象中
返回值為string的無參數方法
delegate string MyDelegate();
public class MyClass
{
public string SayHello()
{
return "Hello the world!";
}
}
public class TestMyClass
{
public static void Main(string[] args)
{
MyClass myClass1=new MyClass();
MyDelegate myDelegate1=new MyDelegate(myClass1.SayHello);
//下面就使用myDelegate1代替對象myClass1的SayHello方法
System.Console.WriteLine(myDelegate1());
//輸出結果為hello the world!
與調用myClass1.SayHello();效果相同
}
}
如果代表元只有這點功能它就沒有什麼太大的用處了,代表元還有一個非常有用的功能就是定義復合代表元對象只有同樣類型的代表元才能夠復合起來 + 能定義復合代表元對象 - 從一個復合代表元中去掉一個代表元對象:
delegate void MyDelegate(string s);
public class MyClass
{
public void SayHello(string who)
{
System.Console.WriteLine( who+"hello!");
}
public void SayGoodBye(string who)
{
System.Console.WriteLine( who+"good bye!");
}
}
public class TestMyClass
{
public static void Main(string[] args)
{
MyClass myClass1=new MyClass();
MyDelegate myDelegate,myDelegate1;
myDelegate=new MyDelegate(myClass1.SayHello);
myDelegate1=new MyDelegate(myClass1.SayGoodBye);
myDelegate+=myDelegate1;
//這樣調用myDeletage就相當於同時調用了
myClass1.SayHello和myClass1.SayGoodBye
myDelegate("love.Net ");
//執行結果輸出love.net hello! love.Net good bye!
}
}