第十七章 C# Action和Func委托 多播 匿名函数 lambda表达式

一.使用 Action和Func委托

方法的返回类型 和 名字千千万万 无法对每个方法都去定义对应的委托  .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);
        }
    }

lambda表达式

1.普通匿名函数的升级版本  (箭头函数)

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 = () => { };


        }
    }

你可能感兴趣的:(c#,开发语言)