一、使用Func定义或Action
//定义一个方法,此方法将被做为一个delegate对象,以参数形式传递给另一个方法
private int sqare(int x)
{
return x * x;
}
//定义一个方法,并将Func这个特定委托作为一个参数
private void getSqare(Func<int,int> dlgt)
{
var i=int.Parse(this.textBox2.Text);
this.textBox1.Text = dlgt(i).ToString();
}
//调用方法,并将定义的第一个方法作为第二个方法的参数
private void button1_Click(object sender, EventArgs e)
{
this.getSqare(sqare);
}
要点:Func<int,int>是一个特定委托写法,它的签名为:
public delegate TResult Func<in T, out TResult>(T arg);
最后一个参数是返回值,前面最多可以有16个T型参数,
private void getSqare(Func<int,int> dlgt) 定义了传给本方法的方法参数,必须可以接收一个Int参数,返回一个int结果
这种委托的用法,必须有两个方法,一个调用,一个被调用,然后还要在其它地方开始两个方法的结合调用
但可以用Lambda表达式改写一下,减少一个方法
//定义一个方法,并将Func这个特定委托作为一个参数
private void getSqare(Func<int, int> dlgt)
{
var i = int.Parse(this.textBox2.Text);
this.textBox1.Text = dlgt(i).ToString();
}
private void button1_Click(object sender, EventArgs e)
{
this.getSqare(x=>x*x);
}
即在调用含方法参数的方法时,直接将一个lambda表达式作为一个方法代入进去
Action与Func的区别只在于有没有返回值
二、直接声明委托
//声明委托形式,即明确参数与返回值
public delegate int dlgt(int i);
//写一个与委托形式相当的方法
private int sqare(int x)
{
return x * x;
}
//写一个以委托为参数的方法
private void getSqare(dlgt dl)
{
var i = int.Parse(this.textBox2.Text);
this.textBox1.Text = dl(i).ToString();
}
//调用上面的委托为参数的方法
...
dlgt dl1 = new dlgt(sqare); //实例化一个委托
getSqare(dl1); //调用方法,并将委托传入
...
同样也可以把委托用lambda简化一下(此处的lambda用了一个复杂形式,注意语法)
public delegate int dlgt(int i);
private void getSqare(dlgt dl)
{
var i = int.Parse(this.textBox2.Text);
this.textBox1.Text = dl(i).ToString();
}
//调用方法
...
dlgt dl1 = new dlgt(x=> { if (x > 10) x = 10; return x * x; });
getSqare(dl1); //调用方法,并将委托传入
...
总结:1、定义委托,明确输入输出类型。2、写一个使用了此委托为参数并在其中用了此委托的方法。3、使用此方法,并将实例化后的委托(可以是一个方法也可以是一个lambda)作为参数传给它