以下内容只是个人理解,仅供参考。
什么是委托?
先看最简单的委托例子
:
namespace DelegateTest
{
public delegate void MessageDelegate(string name);
class Program
{
private static void SaySomething(string name)
{
Console.WriteLine("You said " + name);
}
static void Main(string[] args)
{
MessageDelegate msgDelegate = new MessageDelegate(SaySomething);
msgDelegate("Hello");
Console.ReadKey();
}
}
}
输出结果为
:You said Hello
从代码中我们可以看到,
SaySomething
是一个方法,
delegate
是一个类。
通俗的来说,委托是方法的容器,就像数组
string[]
是
string
变量的容器。
如返回值
void
类型和接收
string
类型参数的委托对象只能绑定同样类型的方法。
MessageDelegate
msgDelegate =
new
MessageDelegate
(SaySomething);
这句代码是初始化委托对象,我们把
SaySomething
这个方法封装进去
msgDelegate
中。
它的构造方法必须要有
1
个方法作为参数才能初始化。
初始化一个委托对象也可以直接赋值一个方法初始化
,
如
:
MessageDelegate
msgDelegate=SaySomething;
这个时候
SaySomething
方法已经装入了委托对象
msgDelegate
内,所以们可以通过调用委托对象来调用已装入的方法。
我们要使用的时候就把委托对象
msgDelegate
当做方法一样调用。
过程总结
:
1.定义委托对象
public
delegate
void
MessageDelegate
(
string
name);
2.
定义方法
private
static
void
SaySomething(
string
name)
{
Console
.WriteLine(
“You said ”
+ name);
}
3.新建一个委托对象然后初始化
MessageDelegate
msgDelegate =
new
MessageDelegate
(SaySomething);
或者
MessageDelegate
msgDelegate=SaySomething;
4.调用委托对象
msgDelegate(“Hello”);
以上是不带返回值的委托,如果要带返回值的委托可以自己制定:
public delegate int AddNumber(int a,int b);
static void Main(string[] args)
{
AddNumber an= new AddNumber(MyFunc);
Int n=an(1,2);
Console.WriteLine(n);
Console.ReadKey();
}
private static int AddFunc(int a,int b)
{
return a+b;
}
多路广播委托:
如果说委托对象是一个容器,那一个委托对象可以绑定多个方法。
很简单,我们使用+=来绑定更多的对象。
反之,我们可以用-=来取消绑定对象。
namespace DelegateTest
{
class Program
{
public delegate void MessageDelegate(string name);
private static void SaySomething(string name)
{
Console.WriteLine("You said " + name);
}
private static void SayAnything(string str)
{
Console.WriteLine(str);
}
static void Main(string[] args)
{
MessageDelegate msgDelegate = new MessageDelegate(SaySomething);
msgDelegate += SayAnything;
msgDelegate("Meh");
Console.ReadKey();
}
}
}
输出结果为
:
You said Meh
Meh
注意:委托对象的列表为空(null)的时候不能调用,但可以绑定或取消绑定对象。
既然委托对象是一个类,那么我们也可以把这个委托对象作为一个方法的参数来传递。
namespace DelegateTest
{
class Program
{
public delegate void MessageDelegate(string name);
private static void SaySomething(string name)
{
Console.WriteLine("You said " + name);