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