委托是一种引用方法的类型.一旦为委托分配了方法,该委托与方法具有相同的类型,委托象其他方法一样具有返回值和参数.如 public delegate int MyDelegate(int x ,int y) 与该委托签名相匹配的方法可以分配给该委托.
delegate关键字用于声明一个引用类型,通常委托用于封装命名方法或匿名方法,委托类似与C,C++中的函数指针,但是是类型安全的,可靠的.(可以用委托给对象封装原来类中没有的方法)
命名方法:
// Declare a delegate:
delegate void Del(int x);
// Define a named method:
void DoWork(int k)
{ /* ... */ }
// Instantiate the delegate using the method as a parameter:
Del d = obj.DoWork;这被称为使用命名的方法,使用命名方法构造的委托可以封装
静态方法和实例方法.
示例:
// Declare a delegatedelegate void Del();class SampleClass{//实例方法public void InstanceMethod(){System.Console.WriteLine("A message from the instance method.");}//静态方法static public void StaticMethod(){System.Console.WriteLine("A message from the static method.");}}class TestSampleClass{static void Main(){SampleClass sc = new SampleClass(); // 委托封装实例方法Del d = sc.InstanceMethod;d();//方法作为参数传递给委托// 封装静态方法d = SampleClass.StaticMethod;d();}}委托类型派生自.net Framework中的Delegate类,是密封的,不能被继承.也不能从中派生自定义类.实例化委托是对象,所以可以作为参数传递,并且可以赋值给属性.方法可以接受作为参数的委托,并且以后可以调用该委托,这叫异步回调.在较长的进程后用来通知调用方的常用方法.自己测试的例子:public delegate void Del( int message );
class MyClass
{
static void Main()
{
MyClass C=new MyClass();
Del d = C.Mymethod;
MyClass.Delmethod(1,9,d);
}
public static void Delmethod(int i,int j,Del callback)
{
callback(i+j);
}
public void Mymethod(int m)
{System.Console.WriteLine(m);
}
}
附:匿名方法(.net2.0引入),将代码块传递给委托,必须使用匿名委托,顾名思义,不用单独创建方法.方法体直接封装在委托内,不创建单独的方法,这样,实例化委托时减少了系统的编码开销.格式 Del d = delegate ( 参数类型 )
{
//方法体
};//注意这个分号.(这是初始化委托并不执行)
delegate void Printer(string s);
class TestClass
{
static void Main()
{
//使用匿名方法初始化委托
Printer p = delegate(string j)
{
System.Console.WriteLine(j);
};
p("The delegate using the anonymous method is called.");
p = new Printer(TestClass.DoWork);//委托的构造函数,还可以这样写 p = TestClass.DoWork;
p("The delegate using the named method is called.");
}
// 命名委托
static void DoWork(string k)
{
System.Console.WriteLine(k);
}
}