说明
委托就是将方法当参数,目的就是避免if-Else(Swith)语句的使用,同时具有很好的扩展性。
今天我们以Delegate和Action为例:
[ Demo—Delegate ]:我们建立一个控制台程序:
namespace Demo__delegate
{
delegate int New(int a, int b); //首先我们在最开始处建立一个委托
class Program
{
static void Main(string[] args)
{
New add = new New(NewAdd1); //实例化一个委托,并执行addstatic1方法
add += NewAdd2; //给委托在绑定一个方法,如果有两个地方显示则自动会全部显示,如果只有一个地方显示,则覆盖之前方法
int r = add(1, 2); //给定数值
Console.WriteLine(r); //结果显示的是第二个方法结果。
Console.ReadKey();
}
//方法一
static int NewAdd1(int a,int b)
{
return a - b;
}
//方法二
static int NewAdd2(int a, int b)
{
return a + b;
}
}
}
[ Demo—Action ]:我们建立一个winfrom程序:
- 我们建立三个窗体,然后一个命名父窗体,两个子窗体。
父窗体:我们建立一个button按钮和一个txt文本框
namespace Demo__Action
{
public partial class frmParent : Form
{
public Action<string> New { get; set; } //首先我们在最开始处建立一个委托
public frmParent()
{
InitializeComponent();
}
private void btnok_Click(object sender, EventArgs e)
{
if (New==null) //判断是否有委托
{
return;
}
New(this.txtParent.Text); //让显示出来的窗体的文本框显示父窗体文本框内容
}
private void Parent_Load(object sender, EventArgs e)
{
//实例化窗体
frmSon son = new frmSon();
frmSon2 son2 = new frmSon2();
New = son.NewtxtSon; //调用NewtxtSon方法传入委托参数
New += son2.NewtxtSon2; //调用NewtxtSon2方法传入委托参数
//第一次用的“=”,是赋值的语法;第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
//程序执行打开两个窗体
son.Show();
son2.Show();
}
}
}
然后我们的两个子窗体直接添加一个txt文本框,然后在里面写一个方法即可。
方法2和这个一样,省略。。。
/// <summary>
/// 自定义一个方法,用于父窗体的调用
/// </summary>
/// <param name="txt"></param>
public void NewtxtSon(string txt)
{
this.txtSon.Text = txt; //将此参数显示在在此窗体文本框内。
}
这个时候我们在父窗体中随便写东西,然后点击button按钮即可在三个窗体中的文本框中显示同样的内容。
委托思想
我们的委托就是在父窗体中设置一个委托,然后在我们也要跟着执行的地方不用设置任何东西,然后父窗体中加载子窗体的方法,子窗体就可以自动执行,这是面向对象性质,如同叫小孩吃饭,之前的方法是我们直接喂给小孩吃饭,现在我们是告诉小孩吃饭,让他自己去吃。其实这个委托和我们之前学到的一个设计模式:Observer观察者模式很相近的。
参考博客。
.net中的各种委托()
C#委托的介绍(delegate、Action、Func、predicate)
举例说明