C#从委托、lambda表达式到linq总结

时间:2022-01-13 18:58:45
 //这个委托类型的名字是MyDeleagte 
    //这个委托代表了一系列函数,这一些函数必须是没有返回值,有两个Int类型的变量
    public delegate void MyDelegate(int x, int y);
    class Program
    {
        static void Main(string[] args)
        {
            // 初始话变量
            MyDelegate myDelegate = new MyDelegate(new Program().Add);
            // 这里调用myDelegate(100, 200);其实等同于myDelegate.Invoke(100, 200);就是等同于变量调用类的方法
            myDelegate(100, 200); 
            //1.委托使得一个方法可以作为令一个方法的参数进行传递
            Method(myDelegate);
            Console.ReadKey();
        }


        void Add(int x, int y)
        {
            Console.WriteLine("两个数的和为{0}", x + y); 
        }

        public static  void Method(MyDelegate myDeleagte)
        {
            myDeleagte(1, 2);
        }
    }

1.为甚不通过Newthod方法直接调用Add方法?

解答:到现在这里发现委托最大的功能就是委托的出现可以是一个方法作为另一个方法的参数进行传递。可以解耦。这就是委托最大作用通过下面例子说明委托的好处

  /// <summary>
    /// 不使用委托实现打招呼的方法
    /// </summary>
    public class Dome
    {
        public void Geeting(string name, GeetingDelegate callback)
        {
            callback(name);
        }


        public void Geeting(string name,string language)
        {
            switch (language)
            {
                case "zh-cn":
                    ChineseGreeting(name);
                    break;
                case "en-us":
                    EnglishGeeting(name);
                    break; 
                default:
                    EnglishGeeting(name);
                    break;
            }
        }

        /// <summary>
        /// 英国人打招呼
        /// </summary>
        /// <param name="name"></param>
        private void  EnglishGeeting(string name)
        {
            Console.WriteLine("Hello"+name);
        }

        /// <summary>
        /// 中国人打招呼
        /// </summary>
        /// <param name="name"></param>
        private void ChineseGreeting(string name)
        {
            Console.WriteLine("你好"+name);
        }
    }

 

     static void Main(string[] args)
        {
            string chName = "小明";
            string enName = "Tom";
            Dome dome1 = new Dome();
            dome1.Geeting(chName, "zh-cn");
            dome1.Geeting(enName, "en-us"); 
            Console.ReadKey();

        }

现在仅仅存在中国和教师的类型如果添加多了就需要修改Geeting方法和适应新的需求

 class Program
    {
        static void Main(string[] args)
        {
            string chName = "小明";
            string enName = "Tom";
            //  引入委托增加了方法的拓展性
            GeetingDelegate chDelegate = new GeetingDelegate(new Dome().ChineseGreeting);
            new Dome().Geeting(chName, chDelegate);
            GeetingDelegate enDelegate = new GeetingDelegate(new Dome().EnglishGeeting);
            new Dome().Geeting(enName, enDelegate);
            Console.ReadKey();

        }



    }

    public delegate void GeetingDelegate(string name);
 
    public class Dome
    {
        public void Geeting(string name, GeetingDelegate callback)
        {
            callback(name);
        }


     

        /// <summary>
        /// 英国人打招呼
        /// </summary>
        /// <param name="name"></param>
        public void EnglishGeeting(string name)
        {
            Console.WriteLine("Hello" + name);
        }

        /// <summary>
        /// 中国人打招呼
        /// </summary>
        /// <param name="name"></param>
        public void ChineseGreeting(string name)
        {
            Console.WriteLine("你好" + name);
        }
    }

这是引入委托后,添加新的类型这需要添加新的方法就可以实现

委托类型还可以添加方法和删除方法添加是用+删除使用-

但是在平时代码中我们看不到有人声明了一个委托类型那是因为.net已经为我们声明了委托类型

第一种是没有返回值的