C# 委托 Delegate
2021-03-23 00:23
标签:基本 顺序 方法 根据 gate 类型 world eth 事件 Delegate 类表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。 以下实例声明为Del的委托,该委托采用字符串作为参数,并返回void的方法: Delegate的实例化和Class的实例化基本类似。 以下实例是,创建一个Del委托的实例。因为该委托声明是:采用字符串作为参数,并返回void的方法,所以实例化该委托时需要传递一个符号条件的方法作为参数: 上面代码可以简写为以下代码: 为委托创建一个DelegateMethod 方法(该方法采用字符串作为参数,并返回void): 调用方式: 简写方式(就像将DelegateMethod方法赋值给一个变量,然后通过传递参数的方式执行这个变量): 因为委托实际上就是一个方法的类型,所以 .NET Framework根据泛型内置了Action与Func两种形式的委托。 Action是无返回值的泛型委托。 Action至少0个参数,至多16个参数,无返回值。 Func是有返回值的泛型委托。 Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void 例如我们有这样一个需求,有一组学生数据,需要根据条件查询出相应的学生列表,在不使用委托的时候可能我们会写出以下的代码: 学生类: 实现代码: 经过我们的分析,发现下面的代码在上面重复了3次,都是循环然后进行逻辑判断。 然后我们通过使用委托,将逻辑封装到一个方法中,然后将方法传递进去,这样我们就减少耦合: 调用: 包含多个方法的委托成为多播委托,调用多播委托,可以按照顺序连续调用多个方法。 多播委托可以用运算符"+"和"+="给委托添加方法调用,同样也可以用运算符"-"和"-="给委托删除方法调用 声明: 事件:是带event关键字的委托的实例,event可以限制变量被外部调用/直接赋值 事件与委托的区别: 事件与委托实例的区别: 我们修改下Student代码,为它添加一个委托的实例对象,一个事件来比较两者的区别: 在Student外边添加下面代码: C# 委托 Delegate 标签:基本 顺序 方法 根据 gate 类型 world eth 事件 原文地址:https://www.cnblogs.com/haowuji/p/9478162.html# C# 委托 Delegate
委托的声明、实例化和调用
声明
public delegate void Del(string message);
实例化
Del handler = new Del(DelegateMethod);
Del handler = DelegateMethod;//简写,只写方法就可以,不用使用new关键字
void DelegateMethod(string message)
{
System.Console.WriteLine(message);
}
调用
Del handler = new Del(DelegateMethod);
handler.Invoke("Hello World");
Del handler = DelegateMethod;
handler("Hello World");
泛型委托--Func Action
Action
public delegate void Action();
Func
public delegate TResult Func
委托的意义
解耦
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
public Student(string name, int age, string email)
{
this.Name = name;
this.Age = age;
this.Email = email;
}
public Student() { }
public void Study()
{
Console.WriteLine("我正在学习……");
}
}
List
foreach (var item in students)
{
if (....)
{
newList.Add(item);
}
}
//定义一个条件委托
delegate bool WhereDelegate(Student s);
//判断年龄是否大于20
bool GetAgeThan(Student s)
{
return s.Age > 20;
}
//判断邮箱长度是否大于10
bool GetEmailLen(Student s)
{
return s.Email.Length > 10;
}
//判断是否年龄在20岁以上并且邮箱长度大于10位
bool GetAgeThanAndEmailLen(Student s)
{
return s.Age > 20 && s.Email.Length > 10;
}
///
//找出20岁以上的学生
List
多播委托
//多播委托
Student s = new Student();
Action action = s.Study;//初始化并添加一个学习的方法
action += s.Sports;//添加一个运动的方法
action();//执行
Console.WriteLine("··············");
action -= s.Sports;//减少一个运动的方法
action();
//输出:
//我正在学习
//我正在运动
//··············
//我正在学习
事件
public event Action OnSports;//Action 是一个委托
public class Student
{
public Action OnStudy;//定义了一个委托的实例
public event Action OnSports;//定义了一个事件
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
public Student(string name, int age, string email)
{
this.Name = name;
this.Age = age;
this.Email = email;
}
public Student() { }
public void Study()
{
if (this.OnStudy != null)
{
this.OnStudy();//调用委托实例
}
Console.WriteLine("我正在学习");
}
public void Sports()
{
if (this.OnSports != null)
{
this.OnSports();//调用事件实例
}
Console.WriteLine("我正在运动");
}
}
Student s = new Student();
s.OnSports = null;//编译错误,提示:事件“Student.OnSports”只能出现在 += 或 -= 的左边(从类型“Student”中使用时除外)
s.OnSports();//编译错误,提示:事件“Student.OnSports”只能出现在 += 或 -= 的左边(从类型“Student”中使用时除外)
s.OnStudy = null;//正常运行
s.OnStudy();//正常运行
上一篇:[APIO2014]回文串
下一篇:win10系统架构调用