以Func为例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace mytest.del
{
class Program
{
static Func<int, int, int> plusDel;
static void Main(string[] args)
{
plusDel = delegate(int a, int b)
{
return a + b;
};
int sum1 = plusDel(1, 1);
plusDel = (a, b) =>
{
return a + b;
};
int sum2 = plusDel(1, 1);
plusDel = new Func<int, int, int>((a, b) =>
{
return a + b;
});
int sum3 = plusDel(1, 1);
plusDel = new Func<int, int, int>(GetResult);
int sum4 = plusDel(1, 1);
Console.WriteLine(string.Format("sum1={0},sum2={1},sum3={2},sum4={3}", sum1, sum2, sum3, sum4));
Console.ReadKey();
}
private static int GetResult(int a, int b)
{
return a + b;
}
}
}
这里的sum1,sum2,sum3,sum4都是为2的。
现在我们自己定义一个委托:
class Program
{
delegate int PlusDel(int a, int b);
static void Main(string[] args)
{
PlusDel del1= GetResult;
PlusDel del2 = new PlusDel(GetResult);
PlusDel del3 = (a, b) => { return a + b; };
int sum1 = del1(1, 1);
int sum2 = del2(1, 1);
int sum3 = del3(1, 1);
}
private static int GetResult(int a, int b)
{
return a + b;
}
}
这里的sum1,sum2,sum3的计算结果也会是一样的。
对于参数声明成delegate的类,可以如下进行操作:
Thread thread1 = new Thread(() => { });
Thread thread2 = new Thread(new ThreadStart(() => { }));
Thread thread3 = new Thread(new ThreadStart(delegate { }));
Thread thread4 = new Thread(new ThreadStart(Method));
private void Method()
{
}
这4个线程的效果可以一样。因为ThreadStart是delegate声明的。
但是对于Delegate声明的参数,如下代码:
this.BeginInvoke(new Action<int, int>((a, b) =>
{
}), new object[] { 1, 1 });
必须使用new关键字进行实例化委托对象。BeginInvoke的原型是如下的:
public IAsyncResult BeginInvoke(Delegate method, params object[] args);
错误或者不足的地方,欢迎大家指正。