C#委托、事件、泛型委托、Lambda表达式各个详解与综合使用(1)

时间:2021-03-02 19:26:05

一直以来,关于c#中的委托、事件、泛型委托以及Lambda表达式的概念和使用都是属于让人比较难以理解和消化的,官方介绍的太难懂,大神的博客又说的太抽象,即使有一天自己也会熟练使用的时候,却发现已经说不出来个所以然,达到只可意会不可言传的境界。而知识的传播是需要分享和沟通的,所以可以既形象又一针见血地表达出心里的东西,让别人能理解,那也是一种能力,而这正是我所追求的。

如何理解委托、事件、泛型委托的概念?

任何一种学科和知识都是相互有关联的,借助这种关联比单独啃一种知识概念来理解要快得多,所以我们来举个生活上的例子分别说下这几种概念。

  • 委托与事件概念理解
    场景说明:教师里在考试(程序运行),等到考试时间结束,老师通过语言(委托),说:“都交卷吧”(委托语句执行),因为事先同学们都已经订阅了老师的收卷动作(事件),所以都把自己的卷子交了上去(invoke)。

    使用代码表现:

    public delegate void Language(string name);
    
    public class Teacher
    {        
        public static void HandUpByName(string name)
        {
            Console.WriteLine(name + "has been handed up the paper");
        }
    
    }
    
    public class Student
    {
        public event Language HandPaper;
        public Student(string name)
        {
            this.myName = name;
        }
    
        public void HandsUpText()
        {
            Console.WriteLine(myName+"has hands up the test");
        }
    
        public void Execute()
        {
            if (HandPaper != null)
                HandPaper(myName);
        }
    
        private string myName { get; set; }
    }
    
    class Program
    {        
        static void Main(string[] args)
        {
            Student A = new Student("小明");
            Student B = new Student("小安");
            //小明和小安分别订阅老师的交卷动作
            A.HandPaper += new Language(Teacher.HandUpByName);
            B.HandPaper += new Language(Teacher.HandUpByName);
            //执行
            A.Execute();
            B.Execute();
    
            Console.ReadKey();
        }        
    }
    

-那么委托与泛型委托又怎么理解呢?

说到泛型委托,需要先了解有哪几种泛型委托,总的来说分为三类:

1、无参数,无返回值:delegate,参照上例。
2、有参数,无返回值:Action,示例:

static void Main(string[] args)
 {
        Action<string> action = ShowMessage;
        action("Hello World");
        Console.ReadKey();
 }

 static void ShowMessage(string message){
        Console.WriteLine("message is " + message);
 }

3、有参数,有返回值:Predicate(T1 obj1),Func(T1, TResult),

Predicate示例

 class Program
    {
        static void Main(string[] args)
        {
            List<Person> list = GetList();
            //绑定查询条件
            Predicate<Person> predicate = new Predicate<Person>(Match);
            List<Person> result = list.FindAll(predicate);
            Console.WriteLine("Person count is : " + result.Count);
            Console.ReadKey();
        }
        //模拟源数据
        static List<Person> GetList()
        {
            var personList = new List<Person>();
            var person1 = new Person(1, "Leslie", 29);
            personList.Add(person1);

            return personList;
        }
        //查询条件
        static bool Match(Person person)
        {
            return person.Age <= 30;
        }
    }

    public class Person
    {
        public Person(int id, string name, int age)
        {
            ID = id;
            Name = name;
            Age = age;
        }

        public int ID
        { get; set; }
        public string Name
        { get; set; }
        public int Age
        { get; set; }
    }

Func示例

class Program
    {
        static void Main(string[] args)
        {
            Func<double, bool, double> func = Account;
            double result = func(1000, true);
            Console.WriteLine("Result is : " + result);
            Console.ReadKey();
        }

        static double Account(double a, bool condition)
        {
            if (condition)
                return a * 1.5;
            else
                return a * 2;
        }
    }

待续