一.委托的概念:
可以以为委托是持有一个或者多个方法的对象,当委托被调用时,它持有的方法也会被调用。
二.委托使用步骤:
- 声明一个委托类型,委托申明看起来和申明方法相似,只是没有方法实现体;
- 使用委托类型,声明一个委托对象;
- 创建委托类型对象,把它赋值给委托对象,一个委托对象,可以绑定一个或多个委托对象(委托组合);
- 执行委托;
public class DelegateHelp
{
//声明一个委托类型
delegate void MyDelegate(String conStr);
static void Main()
{
InnerClass innerClass= new InnerClass();
//声明一个委托对象
MyDelegate myDelegate;
//创建并初始化委托
myDelegate = innerClass.Show1;
//组合委托,一个委托对象,可以绑定多个方法
myDelegate += InnerClass.Show2;
//执行委托
myDelegate("hello");
}
}
class InnerClass {
public void Show1(string context)
{
Console.WriteLine("show1-------"+context);
}
public static void Show2(string context)
{
Console.WriteLine("show2-------" + context);
}
}
三.调用带返回值的委托
如果委托有返回值,并且在调用列表有有一个以上的方法,则调用列表中,最后一个方法的返回值就是委托的返回值,其他方法被忽略;
public class DelegateHelp
{
//声明一个有返回值的委托类型
delegate int SumDeletegate();
static void Main()
{
InnerClass innerClass= new InnerClass();
SumDeletegate sumDeletegate;
sumDeletegate = innerClass.add3;
sumDeletegate += innerClass.add4;
Console.WriteLine("X:" + sumDeletegate());//放回结果是17
}
}
class InnerClass {
int x = 10;
public int add3() {
x += 3;
return x;
}
public int add4() {
x += 4;
return x;
}
}
四.调用带引用参数的委托;
如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变;
public class DelegateHelp
{
delegate void RefDelegate(ref int value);
static void Main()
{
InnerClass innerClass= new InnerClass();
RefDelegate refDelegate;
refDelegate = innerClass.add2;
refDelegate += innerClass.add3;
int value = 3;
refDelegate(ref value);
Console.WriteLine("value:" + value);//放回结果是8
}
}
class InnerClass {
public void add2(ref int value) {
value +=2;
}
public void add3(ref int value)
{
value += 3;
}
}