1. delegate的定义:
定义:委托是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可以像其他任何方法一样,具有参数和返回值.
其声明如下:
public delegate string TestDelegate(string message);
在定义委托时,必须给出它所代表的方法签名和返回类型。 通过delegate关键字来声明委托;
上面的代码定义了一个名字叫 TestDelegate的委托,它所代表的方法有一个string参数,并且其返回类型是string。 委托是一种特殊的对象类型,别的对象都包含数据,委托包含的是方法的地址。 可以在定义类的任何地方定义委托。
2. delegate简单示例
//copy by msdn,changed by Cai using System; // Declare delegate -- defines required signature: delegate void SampleDelegate(string message); public class Delegate_Cai { // Regular method that matches signature: public void ShowMsg(string message) { Console.WriteLine(message); } } public class Test_Delegate_Cai { public void Test1() { Delegate_Cai dd=new Delegate_Cai(); // Instantiate delegate with named method: SampleDelegate d1=dd.ShowMsg; // Instantiate delegate with anonymous method: //匿名方法 SampleDelegate d2 = delegate(string message) { Console.WriteLine(message); }; // Create an instance of the delegate with method; SampleDelegate d3=new SampleDelegate(dd.ShowMsg); d1("Hello"); d2(" World"); d3("static"); } }
3. 应用委托、匿名方法的例子:
//-------------------------- 委托和匿名方法、lambda表达式的例子---------------------------------------- public class testDelegate2 { //定义委托 public delegate bool stringFilter(string i); //定义命名方法 public bool ContainFunc(string s) { if (s.Contains("bei") && s.Length > 5) return true; else return false; } public List<string> SelectString(List<string> s, stringFilter startFilter) { List<string> str = new List<string> { }; foreach (string item in s) { if (startFilter(item)) str.Add(item); } return str; } //通过委托可以编写高可重用的代码 public void testFunc() { //stringFilter myfilter = ContainFunc; List<string> str = new List<string> { "guangdong", "hebei", "guangxi", "hunan","hubei","beijing" }; List<string> result = SelectString(str, ContainFunc); foreach (string s in result) { Console.WriteLine(" " + s); } } //通过匿名方法来指定委托方法 public void testFunc2() { List<string> str = new List<string> { "guangdong", "hebei", "guangxi", "hunan", "hubei", "beijing" }; List<string> result = SelectString(str, delegate(string s) { return (s.Contains("bei") && s.Length > 5); }); foreach (string s in result) { Console.WriteLine(" " + s); } } //通过lambda表达式来指定委托方法 public void testFunc3() { List<string> str = new List<string> { "guangdong", "hebei", "guangxi", "hunan", "hubei", "beijing" }; List<string> result = SelectString(str, s => (s.Contains("h") && s.Length > 5)); foreach (string s in result) { Console.WriteLine(" " + s); } } }
4. 委托与接口
泛型概述
委托和接口都允许类设计器分离类型声明和实现。给定的接口可由任何类或结构继承和实现;可以为任何类中的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?
在以下情况中使用委托:
- 当使用事件设计模式时。
- 当封装静态方法可取时。
- 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。
- 要方便的组合。
- 当类可能需要该方法的多个实现时。
在以下情况中使用接口:
- 当存在一组可能被调用的相关方法时。
- 当类只需要方法的单个实现时。
- 当使用接口的类想要将该接口强制转换为其他接口或类类型时。
- 当正在实现的方法链接到类的类型或标识时:例如比较方法。