1)理解
委托实际上就是“命令”,比如“小明委托小张去买火车票”,也就是“小明命令小张去买火车票”。也就是说的是,对于委托者来说,他是什么也不做的,他只是一个命令的发出者,而被委托者,则是执行委托者所发出的命令。
通过委托实现窗体回传值,就是实现一个解决方案中两个窗体实现相互传值,实现的方法就是将相应的委托对象借助构造方法来实现相应的实现。
2)实例中理解委托机制
==>定义委托
delegate void HandleInterfaceUpdateDelegate(string text); 使用关键字delegate进行声明表示这是一个委托,并表示每个委托的实例都包含一个方法的细节,并且该方法带有一个string类型的参数,比如eat(string food),不能传入eat()这类方法。
==> 实例化委托对象
HandleInterfaceUpdateDelegate interfaceUpdateHandle;
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox);
private void UpdateTextBox(string text)
{
contentN2.Text = text;
}
实质上,创建委托并实例化委托对象,和创建普通的类并创建类对象的原理是一样的。可以看出的是,创建委托对象时,传入的是某一个方法名,而在委托中,则是存储的是需要操作的方法地址。
3)执行
this.Invoke(interfaceUpdateHandle, new string[] { Encoding.Unicode.GetString(readBuffer) });
此时委托已经被附上了具体的方法。
实例:
==> 准备工作
新建一个解决方案,在这个解决方案中,通过新建项目选项,分别创建三个项目,其中包括两个“控制台项目01、02”和一个“类库项目”。(此时自己创建了一个类库,当其他项目想要使用这个类库项目中的方法,必须要将这个类库项目引用到相应的项目中)
==>代码
1) 结果最终实现
其中控制台01项目输出字符串“今天天气不错!”,而控制台02项目输出当前时间。
2) 方案实现
最简单的方法实现就是在类库中创建两个方法,一个是“console.writeline(“今天天气不错!”);”,另一个方法则是“console.writeline(“时间{0}”,DateTime.Now.toString());”。对于这个简单的问题使用这个方法实现是没有问题的,这只是两个需求,如果是存在着200个这样的需求,而对于类库而言,它就是一个共享库,如果每次都要进行改动,那么对于整体项目是没有好处的,因此,对于类库而言,只是实现化简,不能增加负担。
3) 使用委托模式实现
==>定义委托
创建委托和创建类是一样的,如public delegate void aa();只是对于委托是没有方法体的。
==>代码
控制台01:
namespace _01委托
{
class Program
{
static void Main(string[] args)
{
DeleteLibrary.Class1 delete =new DeleteLibrary.Class1();
delete.deleDemo = method1;
delete.aa();
Console.Read();
}
static void method1()
{
Console.WriteLine("当前时间是{0}",DateTime.Now.ToString());
}
}
}
控制台02:
namespace _02委托
{
class Program
{
static void Main(string[] args)
{
DeleteLibrary.Class1 delete =new DeleteLibrary.Class1();
delete.deleDemo = method2;
delete.aa();
Console.Read();
}
static void method2()
{
Console.WriteLine("今天天气不错");
}
}
}
公共类库:
namespace DeleteLibrary
{
public class Class1
{
public aaDelegate deleDemo;
public void aa()
{
Console.WriteLine("******************");
Console.WriteLine("******************");
if (deleDemo != null)
{
deleDemo();
}
Console.WriteLine("******************");
Console.WriteLine("******************");
}
}
}
委托:
namespace DeleteLibrary
{
public delegate void aaDelegate();
}