委托
委托(delegate)其实就是将一个方法放到放到另一个方法里面,通过调用另一个方法来实现这个方法的具体功能,而另一个方法就是我们所说的委托。
委托分为三种:命名方法委托,多播委托,匿名委托。
一、命名方法委托
命名方法委托是通过方法名进行方法的订阅。
1、委托的声明方式:
访问修饰符 delegate 返回值 委托名称;
2、委托实例化:
委托名 委托对象 = new 委托名(方法名);
案例分析:
namespace c_Delegate
{
internal class Program
{
public delegate void OnClickDelgate();//声明一个委托
static void Main(string[] args)
{
//将GameStart方法委托给onStartCilck代替执行
OnClickDelgate onStartClick = new OnClickDelgate(GameStart);
onStartClick();
//将GameOver方法委托给onOverCilck代替执行
OnClickDelgate onOverClick = new OnClickDelgate(GameOver);
onOverClick();
}
public static void GameStart()
{
Console.WriteLine("游戏开始");
}
public static void GameOver()
{
Console.WriteLine("游戏结束");
}
}
}
运行结果:
二、多播委托
委托可以通过“+=”进行方法的订阅,通过“-+”取消订阅。
namespace c_Delegate
{
class Program
{
//声明委托
public delegate void OnClickDelgate();
static void Main(string[] args)
{
//委托实例化
OnClickDelgate onStartClick = new OnClickDelgate(GamePlay.GameStart);
//委托订阅方法
onStartClick += GamePlay.PlayerCreate;
onStartClick += GamePlay.PlayerDie;
onStartClick += GamePlay.GameOver;
//调用委托
onStartClick();
}
}
class GamePlay
{
public static void GameStart()
{
Console.WriteLine("游戏开始");
}
public static void PlayerCreate()
{
Console.WriteLine("创建角色");
}
public static void PlayerDie()
{
Console.WriteLine("角色死亡");
}
public static void GameOver()
{
Console.WriteLine("游戏结束");
}
}
}
运行结果:
三、匿名委托
匿名委托就是在委托中定义代码块,并通过委托的形式进行实现。就是把订阅委托中的方法换成了具体的代码块。
例如:
class Program
{
public delegate void OnClickDelgate();
static void Main(string[] args)
{
OnClickDelgate onStartClick = new OnClickDelgate(PlayGame);
}
public static void PlayGame()
{
Console.WriteLine("我要玩游戏");
}
}
class Program
{
public delegate void OnClickDelgate();
static void Main(string[] args)
{
OnClickDelgate onStartClick = delegate
{
Console.WriteLine("我要玩游戏");
};
onStartClick();
}
}
上面第一部分为命名方法委托,第二部分则为匿名委托。上面两种代码的运行结果都是相同的。但是匿名委托中方法不能够重复利用,用途很少,一般只用在只执行一次的委托中。