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; } }
待续
阅读全文
1 0
- C#委托、事件、泛型委托、Lambda表达式各个详解与综合使用(1)
- c# 委托、事件、lambda表达式
- C#委托/Lambda表达式/事件
- 委托,Lambda表达式与事件
- c#委托事件与lambda (整理)
- c#委托与Lambda表达式
- 委托,事件,回调,匿名函数与Lambda表达式详解
- C# 委托 事件 匿名函数 Lambda表达式
- C# 委托-lambda表达式
- [连载]C#程序设计(15)--- 委托、事件和Lambda表达式
- 详解C#委托、时间和Lambda表达式
- C#泛型委托与Lambda总结
- 委托与Lambda表达式
- 委托使用lambda表达式
- Lambda表达式委托使用
- 泛型委托 + Lambda表达式
- c#委托与事件(详解)
- C#委托与事件详解
- 【1027】正整数每位数累加
- MySQL慢查询
- Webservice与Servlet
- PalindromePartitioningLi
- ubuntu 下基于mycat的mysql读写分离配置
- C#委托、事件、泛型委托、Lambda表达式各个详解与综合使用(1)
- 日常生活小技巧 -- 示波器和万用表的使用
- asp.net MVC3的ViewBag关于List的使用
- python3百度贴吧爬虫案例
- 1058. 选择题(20)--Python
- (转)非常完善的Log4net详细说明
- iOS开发笔记之六十八——FRP与RAC介绍(一)
- 显式参数和隐式参数
- Python学习笔记---开发环境搭建