1、为什么要用委托?
委托可以将方法作为实参传递给另一个方法,那么我们在winform开发中经常会遇到这样的情况,窗体1中定义了方法1,在窗体1中我们要打开窗体2,并且在窗体2中也要用到方法1,这个用法在窗体1是主窗体,窗体2是参数设置窗体的情况下经常使用,比如我开发运动控制软件,窗体1中有读取某个轴的坐标的方法1,我要利用窗体2去设置一个坐标,那么我就可以将方法1通过委托在实例化窗体2的对象时,将委托作为窗体2构造函数的参数传入,代码如下:
public partial class Form2 : Form
{
Func<int, string>[] GetValueDelegate;
Action<int> ShowValueDelegate;
public Form2(Func<int, string>[] func, Action<int> action)
{
this.GetValueDelegate = func;
this.ShowValueDelegate = action;
InitialForm();
InitializeComponent();
}
private void InitialForm()
{
for(int i=0;i< GetValueDelegate.Length;i++)
{
string str = GetValueDelegate[i](10);
Console.WriteLine("轴{0}的坐标是{1}",i,str);
}
ShowValueDelegate(200);
}
}
Form2中定义了两种委托,一个是有返回值的委托数组func,另一个是没有返回值的委托action,我们将这两个委托作为构造函数的参数传入,InitialForm的作用就是调用这两个委托。
private void button1_Click(object sender, EventArgs e)
{
Func<int, string>[] func=new Func<int, string>[2];
Action<int> action;
func[0] = GetValue0;
func[1] = GetValue1;
action = ShowValue;
Form2 fm2 = new Form2(func, action);
if (fm2.ShowDialog() == DialogResult.OK)
{
Console.WriteLine();
}
}
private string GetValue0(int value)
{
double str = value + 10;
return str.ToString();
}
private string GetValue1(int value)
{
double str = value + 20;
return str.ToString();
}
private void ShowValue(int value)
{
Console.WriteLine(value);
}
我们在button1事件中,声明委托,并对委托进行赋值,然后实例化Form2并将委托作为参数传入,最终得到的结果如下:
轴0的坐标是20
轴1的坐标是30
200
我们成功的将委托作为参数传入了form2中,并且实现了调用,所以这里委托将方法作为参数进行跨窗体传值是非常方便的。