委托
/*
* 委托是一种数据类型(既然是数据类型,就可以定义变量),是来存储方法的
*
* 语法:[访问修饰符] delegate 返回类型 委托名();
*
*/
class Program
{
static void Main(string[] args)
{
//MyClass mc = new MyClass();
//2.使用委托第二步:声明委托变量,并赋值
//声明一个委托变量md,并且new了一个委托对象,并且把方法M1传递了进去
//即md委托保存了M1方法
MyDelegate md = new MyDelegate(M1);
//3.调用md委托的时候就相当于调用了M1方法
md();
Console.WriteLine("ok");
//实例化MachCalc类
MachCalc mc = new MachCalc();
//实例化委托
CallBack cb = new CallBack(mc.Plus);
CallBack cb2 = new CallBack(mc.Minus);
//调用委托
int res = cb(10,20);
int jian = cb2(20, 10);
Console.WriteLine("res的值是:{0}", res);
Console.WriteLine("jian的值是:{0}", jian);
Console.ReadKey();
}
static void M1()
{
Console.WriteLine("我是一个没有返回值没有参数的方法");
}
}
//1.定义委托
//定义一个委托类型,用来保存无参数,无返回值的方法
//定义了一个名字叫MyDelegate的类型 ,并且这个类型是个委托,而且只能存储没有返回值,没有参数的方法
//委托要定义在命名空间中和类是同一级别的
public delegate void MyDelegate();
//定义了一个MyClass的一个类型
public class MyClass
{
}
//定义委托
public delegate int CallBack(int n1,int n2);
class MachCalc
{
//两个整数类型相加
public int Plus(int num1,int num2)
{
return num1 + num2;
}
//两个整数类型相减
public int Minus(int num1,int num2)
{
return num1 - num2;
}
}
Lambda表达式、匿名函数
/*
* 1.委托是一种数据类型,像类一样的一种数据类型,一般都是直接在命名空间中定义
* 2.定义委托时,需要指明返回值类型、委托名与参数列表,这样就能确定该类型的委托能存储什么样的方法
* 3.使用委托:
* a:声明委托变量
* b:委托是一个引用类型,像类一样,所以当声明委托变量后,如果不赋值则该委托变量为null,所以再使用委托变量前最好做
* 非空校验weituo!=null
* c:委托类型的变量只能赋值一个委托类型的对象
*
*
* 匿名方法:
* 不能直接在类中定义,而是在给委托变量赋值的时候,需要赋值一个方法,此时可以“现做现卖”,定义一个匿名方法传递给该委托
* 语法:
* 委托类型 委托实例 = delegate([参数列表]){
* //代码块
* };
*
* lambda表达式:
* (参数类型 参数)=>表达式
*
*/
class Program
{
static void Main(string[] args)
{
//MyDelegate md = M1;
//md();
//无参数,无返回值的一个匿名方法
//MyDelegate md = delegate ()
//{
// Console.WriteLine("hello 我是匿名方法");
//};
//md();
//无参数,无返回值的方法使用(lambda)λ表达式
MyDelegate md = () => { Console.WriteLine("lambda表达式"); };
md();
//有参数,无返回值的一个匿名方法
//MyDelegate2 md2 = delegate (string msg)
//{
// Console.WriteLine("早上好!" + msg);
//};
//md2("黄鹏");
MyDelegate2 md2 = m => { Console.WriteLine(m); };
md2("无返回值有参数的lambda表示式");
//有参数,有返回值的匿名方法
//AddDelegate add = delegate (int n1, int n2, int n3)
//{
// return n1 + n2 + n3;
//};
//int res = add(10, 20, 30);
//Console.WriteLine(res);
AddDelegate add = (x, y, z) => { return x + y + z; };
int res = add(10, 30, 60);
Console.WriteLine(res);
Console.ReadKey();
}
static void M1()
{
Console.WriteLine("OK");
}
}
public delegate void MyDelegate();
public delegate void MyDelegate2(string msg);
public delegate int AddDelegate(int n1, int n2, int n3);
事件
/*
* 定义:事件:单词Event 能够发生的什么事情
* 角色:使对象和类具备通知能力的成员
* 理解:对象o拥有一个事件e,想表达的思想是:当事情e发生的时候,o有能力通知别的对象
* 使用:用于对象或类间的动作协调与信息传递(消息推送)
*
* 事件模型的五个组成部分
* 1.事件的拥有者(event source,对象)
* 2.事件成员 (event,成员)
* 3.事件的响应者(event subscriber,对象)
* 4.事件处理器(event handle,成员)——————本质上是一个回调方法
* 5.事件订阅——————把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”
*
* 事件基于委托
* C#中时间处理步骤:
* 1.定义事件
* [访问修饰符] event 委托名 事件名
* 2.订阅事件
* 事件名 += new 委托(事件处理方法名)
* 3.事件发生时通知订阅者发生的事件
* 事件名([参数列表]);
*
*/
//Teacher是教师类
public class Teacher
{
//定义一个委托和一个事件
public delegate void ListenerEventHandler();
public event ListenerEventHandler ListenerEvent;
//定义引发事件的方法
public void BeginClass()
{
Console.WriteLine("教师宣布开始上课");
if (ListenerEvent != null)
{
ListenerEvent(); //引发事件
}
}
}
//学生类
public class Student
{
private string stuName;//学生姓名
//构造方法
public Student(string name)
{
this.stuName = name;
}
public void Listener()
{
Console.WriteLine("学生{0}正在认真听课", stuName);
}
public void Record()
{
Console.WriteLine("学生{0}正在做笔记", stuName);
}
public void Sleep()
{
Console.WriteLine("学生{0}正在睡觉", stuName);
}
}
class Program
{
static void Main(string[] args)
{
Teacher t = new Teacher();
Student stu1 = new Student("黄鹏");
Student stu2 = new Student("高洋");
Student stu3 = new Student("翁志磊");
//三个学生都订阅了一个事件
t.ListenerEvent += new Teacher.ListenerEventHandler(stu1.Listener);
t.ListenerEvent += new Teacher.ListenerEventHandler(stu2.Record);
t.ListenerEvent += new Teacher.ListenerEventHandler(stu3.Sleep);
//触发事件
t.BeginClass();
Console.ReadKey();
}
}
网友评论