1.委托的声明
委托是引用类型,因此有引用和对象,使用方法和类相似。
可以把委托看做一个包含有序列表的对象,但是这些方法必须具有相同的签名和返回类型。
delegate void MyDel (int x) //delegate 关键字 viod 表示返回类型 int x 表示参数类型
委托看起来和方法很类似,需注意是没有方法主体。
2.创建委托对象
delegate void MyDel (int x)
MyDel delVar ; //创建委托变量
delVal = new MyDel (Class.Method) ; //创建委托,并保存引用
delVal = Class.Method ; //创建委托,并保存引用 ,语法和上面相同
3.给委托赋值
MyDel delVar ;
delVar = Class.method1 ;
delVar = Class.method2 ; //创建新的委托并对对象赋值,上面的method1将会被垃圾站回收
4.组合委托
委托可以使用“+”运算符来组合,最终会创建一个新委托。
MyDel delVar1 = Class.method1 ;
MyDel delVar2 = Class.method2 ;
MyDel deVar3 = delVar1 + delVar2 ;
5.为委托添加方法和移除方法
使用“+=”可以为委托增加方法。
MyDel delVar = Class.method1 ;
delVar += Class.method2 ;
delVar += Class.method3 ;
delVar -= Class.method1 ;
如果调用列表(书244)有很多实例,-=运算符将从列表最后开始搜索,并且移除与第一个方法相匹配的实例。
6.委托示例代码如下:
delegate void MyDel() ;
class Test
{
public void Print1()
{Console.WriteLine("Print1 -- instance");}
public static void Print2()
{ Console.WriteLine("Print2 -- static"); }
}
class Program
{
static void Main(string[] args)
{
Test t = new Test();
MyDel del = t.Print1;
del += Test.Print2;
del += t.Print1;
del += Test.Print2;
if (null != del)
del();
else
Console.WriteLine("Delegate is Empty!");
}
}
7.调用带引用参数的委托
注意:不加ref答案是7 ,加ref答案是12
delegate int MyDel( ref int value) ;
class MyClass
{
public int Add2( ref int value) { value += 2; return value; }
public int Add3( ref int value) { value += 3; return value; }
}
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
MyDel Del = mc.Add2;
Del += mc.Add3;
Del += mc.Add2;
int value = 5;
Console.WriteLine("{0}" ,Del( ref value));
}
}