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

来源:互联网 发布:文明5 mac 语言 编辑:程序博客网 时间:2024/05/16 07:43

一直以来,关于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;        }    }

待续