方法的返回类型 和 名字千千万万 无法对每个方法都去定义对应的委托 .nt为了方便使用委托 定义了两个泛型委托
Action Action委托表示一个void返回类型的方法
例1
MyDelegate myDelegate =new MyDelegate (ProgramMothod);
myDelegate();
Action myAction = new Action (ProgramMothod);
myAction ();
delegate void MyDelegate();
private static void ProgramMothod() {
Console.WriteLine("123");
}
例2
MyDelegate1 myDelegate1 = new MyDelegate1 (ProgramMothod);
myDelegate1(10);
Action action1 = new Action (ProgramMothod);
action1(10);
delegate void MyDelegate1(int a);
private static void ProgramMothod(int a)
{
Console.WriteLine(a);
}
例3
Action action2 =new Action (ProgramMothod);
action2("111", 200);
private static void ProgramMothod(string b ,int a)
{
Console.WriteLine(a);
Console.WriteLine(b);
}
/Func委托表示一个带返回类型的方法
例1
MyDelegate3 myDelegate3 = new MyDelegate3(ProgramMothod1);
myDelegate3();
Func func = new Func(ProgramMothod1);
func();
delegate string MyDelegate3();
private static string ProgramMothod1()
{
return "123";
}
例2
MyDelegate4 myDelegate4 =new MyDelegate4 (ProgramMothod2);
string tempStr2 = myDelegate4(10);
//如果有参数 返回值类型在最后
Func func1 = new Func(ProgramMothod2);
string tempStr1 = func1 (10);
delegate string MyDelegate4(int b);
private static string ProgramMothod2(int a)
{
return a.ToString();
}
例3
MyDelegate5 myDelegate5 =new MyDelegate5 (ProgramMothod3);
string tempStr = myDelegate5(10,20);
Func func2 =new Func (ProgramMothod3);
string tempStr3 = func2(10,20);
delegate string MyDelegate5(int b, int a);
private static string ProgramMothod3(int a,int b)
{
return a.ToString()+b.ToString();
}
1.委托对象可使用 "+" 运算符进行合并。
2."-" 运算符可用于从合并的委托中移除组件委托
3.只有相同类型的委托可被合并
static void Main(string[] args)
{
MyDelegate myDelegate =new MyDelegate(ProgramMothod);
myDelegate();
MyDelegate myDelegate1 = new MyDelegate(ProgramMothod1);
myDelegate1();
MyDelegate myDelegate2 = new MyDelegate(ProgramMothod);//
//myDelegate2 多播
/*
委托的多播
1.方法的类型相同
2.同时执行
3.委托对象利用+=方式 完成多播的使用 -=取消多播操作
*/
myDelegate2 += ProgramMothod1;
myDelegate2();
myDelegate2 -= ProgramMothod1;
myDelegate2();
//Action 多播
Action action;
Action action1 =new Action(ProgramMothod);
Action action2 = new Action(ProgramMothod1);
action = action1;
action += action2;
Console.ReadKey();
}
delegate void MyDelegate();
static void ProgramMothod() {
Console.WriteLine("123");
}
static void ProgramMothod1()
{
Console.WriteLine("456");
}
}
internal class Program
{
static void Main(string[] args)
{
ProgramMothod_1(ProgramMothod_2);
Console.ReadKey();
}
public static void ProgramMothod_1(Action action) {
action();
}
public static void ProgramMothod_2()
{
Console.WriteLine("11");
}
1.事件基于委托的,可以为任何一种委托提供一种发布\订阅机制。(类似委托多播)
2.使用event关键字将一个委托类型定义为事件 事件就是委托的一个对象
internal class Program
{
static void Main(string[] args)
{
Heater heater = new Heater();
heater.BoilEvent += Heater1;
heater.BoilEvent += Heater2; //添加事件
heater.BoilWater();//执行事件
}
public static void Heater1(int x) {
Console.WriteLine("水已经{0}度了,可以用茶杯接水了",x);
}
public static void Heater2(int x)
{
Console.WriteLine("水已经{0}度了,可以用大桶接水了", x);
}
}
//烧开水事件 类
public class Heater
{
private int temperature;//水温
public delegate void BoilHandle(int x);//声明关于事件的委托
public event BoilHandle BoilEvent;//声明水要烧开的事件
public void BoilWater()
{ //烧水的方法
for (int i = 0; i <= 100; i++)
{
temperature = i;
if (temperature > 96)
{
if (BoilEvent != null)
{
BoilEvent(temperature);
}
}
}
}
}
1.针对委托的使用
2.可以快捷的使委托实例化。
3.不建议再使用匿名函数,C#3.0后使用lambda表达式替代匿名函数
4.格式 : 委托对象 = delegate (){};
匿名函数的写法
:
class Program
{
delegate int MyDelegate(int a, int b);
static void Main(string[] args)
{
MyDelegate md = delegate(int a, int b) { return a + b; };
int sum = md(1,2);
Console.WriteLine(sum);
}
}
2.比普通匿名函数更为简洁,数据类型可以不用写
class Program
{
delegate int MyDelegate(int a, int b);
static void Main(string[] args)
{
MyDelegate md = (a,b)=>{return a+b;};
int sum = md(1, 2);
Console.WriteLine(sum);
//无参无返回值匿名函数
Action action = () => { };
}
}