委托和反射
1. 委托(就是用变量调方法)
有一个方法,自己不调用,而将自己委托给另一个变量
由这个变量执行这个方法,执行结果和这个方法自己执行是一样的
步骤:
1)声明一个方法
2)声明一个委托类型 public|internal delegate 返回值 委托名(参数列表);
3)声明委托类型的变量
4)授权方法 委托变量=方法名;
5)使用这个变量进行调用(就好像这个变量是方法的别名一样,调用格式与原方法一模一样)
定义委托名一般有两种格式 Delegate名字 名字Handler(系统中定义的委托一般用hanler)
2. 委托之前,方法只能进行调用;而使用委托,则使方法可以赋值给一个变量,使方法的使用变得更加灵活
委托在实际使用中的例子
1)自定义排序
2)窗体传值
3)多线程操作
3. 事件
委托是类型,事件是特殊的委托变量
在winform程序中,我们给一个控件添加事件,那么在Form1.Designer.cs中会出现如下一行
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
即给Form1的MouseMove属性 绑定了 一个new 委托(方法)
事件有两个概念
”日常讲的使用事件使用事件“讲的是微软的一个名词,叫做事件。指的是使用一种语法操作实现这种机制
而考虑刚刚给控件添加事件这个过程,
事件是:当我对我的应用程序做一个动作的时候,
我的应用程序的底层就去判断我是否给它绑定了一个事件执行方法。如果绑定了,那么就
把这个方法调用一次,我将看到结果。如果没有绑定,那么在系统底层将什么都不做。
有一个触发的行为,会产生一个响应代码
4. 事件是怎么依赖委托来实现的?
底层有一个消息循环,它监听你做了什么操作,执行On系方法
protected virtual void OnMouseMove(MouseEventArgs e)
{
MouseEventHandler handler = (MouseEventHandler) base.Events[EventMouseMove];
if (handler != null)
{
handler(this, e);
}
}
而handler = base.Events[EventMouseMove] 就代表上层的这个MouseMove属性
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
上层通过委托来绑定方法this.Form1_MouseMove
既然事件是依赖委托来实现的,是不是用事件能做的事委托都能做?为什么要用事件,好处是什么?
5. 事件解决了委托存在的两个问题
1)委托链可以累加方法
+= 误用了 = 那么只会执行最后一个=的方法,不安全,有被覆盖的隐患
2)使用public的委托,容易造成盗用事件
可以盗用public的方法 委托绑定不想让其绑定的public方法 不安全
为了解决这个问题,我们可以使用属性进行约束,设置只能追加方法和移除方法,不能用
=来赋值,只允许方法在内部调用,不允许在外部调用
前面讨论的都是事件这个过程
下面讨论的是事件这个名词,事件语法
在定义委托变量的时候,在前面写上event,表示是一个事件
事件的过程就是你做一个动作,触发一系列的操作
比如说你写一个手机下载的操作,它会执行一系列的操作。
先判断当前是不是wifi情况,是不是正在充电状态,异步操作等一系列操作
封装成事件队列来调用
适配者模式:写死是不好的,而应该采用 我装配什么,就执行什么的方式
如果将来你写了一个类库,有两种方法可以采用
第一种方法是把你的所有方法放到类库里面调用,那么一旦需求改变,这个类库重新编译
第二种方法是采用事件调用方法序列的方式,有需求改变,类库不用改,只需要改变事件的方法序列
6. 事件的本质
C#的简化记法
public event EventHandler<CarInfoEventArgs> NewCarInfo;
该简化记法的较长形式--类似于自动属性和完整属性之间的关系
private delegate EventHandler<CarInfoEventArgs> newCarInfo;
public event EventHandler<CarInfoEventArgs> NewCarInfo
{
add
{
newCarInfo += value; //添加到事件的方法队列中
}
remove
{
newCarInfo -= value;
}
}
事件实际上是一个私有委托变量加两个方法,这两个方法限定了只能使用+=和-=
而私有委托变量就限定了方法只能在内部调用,而不能在外部调用
委托和事件的区别:
委托是一种类型;而事件是一个私有委托字段加两个方法
7. 委托和事件的底层都依赖反射技术
什么是反射?就是从dll中得到类的信息,创建对象并调用方法
前面是:添加引用,创建对象,通过.方法来调用
反射是:把dll当作文件来读,在不知道类的情况下,调用这个对象
接口规定协议--只要最后实现了接口的内容
8. 如何实现反射
第一种情况
1)如果操作的是dll或exe文件,使用Assembly.LoadFile()方法获得dll数据
注意dll文件必须是全路径Path.GetFullPath()
得到Assembly对象以后,使用GetType获得类型信息(Type)
第二种情况
1)如果使用的是类型而不是文件,使用typeof运算符或对象.GetType()方法
2)得到Type数据以后,可以使用Activator.CreateInstance(Type)创建类型指定的对象
3)使用Type对象的Get系方法获得描述信息
4)使用MethodInfo对象的Invoke方法进行调用
在做架构,在做框架时才会用到反射,做.net framework底层的内容
1. 委托(就是用变量调方法)
有一个方法,自己不调用,而将自己委托给另一个变量
由这个变量执行这个方法,执行结果和这个方法自己执行是一样的
步骤:
1)声明一个方法
2)声明一个委托类型 public|internal delegate 返回值 委托名(参数列表);
3)声明委托类型的变量
4)授权方法 委托变量=方法名;
5)使用这个变量进行调用(就好像这个变量是方法的别名一样,调用格式与原方法一模一样)
定义委托名一般有两种格式 Delegate名字 名字Handler(系统中定义的委托一般用hanler)
2. 委托之前,方法只能进行调用;而使用委托,则使方法可以赋值给一个变量,使方法的使用变得更加灵活
委托在实际使用中的例子
1)自定义排序
2)窗体传值
3)多线程操作
3. 事件
委托是类型,事件是特殊的委托变量
在winform程序中,我们给一个控件添加事件,那么在Form1.Designer.cs中会出现如下一行
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
即给Form1的MouseMove属性 绑定了 一个new 委托(方法)
事件有两个概念
”日常讲的使用事件使用事件“讲的是微软的一个名词,叫做事件。指的是使用一种语法操作实现这种机制
而考虑刚刚给控件添加事件这个过程,
事件是:当我对我的应用程序做一个动作的时候,
我的应用程序的底层就去判断我是否给它绑定了一个事件执行方法。如果绑定了,那么就
把这个方法调用一次,我将看到结果。如果没有绑定,那么在系统底层将什么都不做。
有一个触发的行为,会产生一个响应代码
4. 事件是怎么依赖委托来实现的?
底层有一个消息循环,它监听你做了什么操作,执行On系方法
protected virtual void OnMouseMove(MouseEventArgs e)
{
MouseEventHandler handler = (MouseEventHandler) base.Events[EventMouseMove];
if (handler != null)
{
handler(this, e);
}
}
而handler = base.Events[EventMouseMove] 就代表上层的这个MouseMove属性
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
上层通过委托来绑定方法this.Form1_MouseMove
既然事件是依赖委托来实现的,是不是用事件能做的事委托都能做?为什么要用事件,好处是什么?
5. 事件解决了委托存在的两个问题
1)委托链可以累加方法
+= 误用了 = 那么只会执行最后一个=的方法,不安全,有被覆盖的隐患
2)使用public的委托,容易造成盗用事件
可以盗用public的方法 委托绑定不想让其绑定的public方法 不安全
为了解决这个问题,我们可以使用属性进行约束,设置只能追加方法和移除方法,不能用
=来赋值,只允许方法在内部调用,不允许在外部调用
前面讨论的都是事件这个过程
下面讨论的是事件这个名词,事件语法
在定义委托变量的时候,在前面写上event,表示是一个事件
事件的过程就是你做一个动作,触发一系列的操作
比如说你写一个手机下载的操作,它会执行一系列的操作。
先判断当前是不是wifi情况,是不是正在充电状态,异步操作等一系列操作
封装成事件队列来调用
适配者模式:写死是不好的,而应该采用 我装配什么,就执行什么的方式
如果将来你写了一个类库,有两种方法可以采用
第一种方法是把你的所有方法放到类库里面调用,那么一旦需求改变,这个类库重新编译
第二种方法是采用事件调用方法序列的方式,有需求改变,类库不用改,只需要改变事件的方法序列
6. 事件的本质
C#的简化记法
public event EventHandler<CarInfoEventArgs> NewCarInfo;
该简化记法的较长形式--类似于自动属性和完整属性之间的关系
private delegate EventHandler<CarInfoEventArgs> newCarInfo;
public event EventHandler<CarInfoEventArgs> NewCarInfo
{
add
{
newCarInfo += value; //添加到事件的方法队列中
}
remove
{
newCarInfo -= value;
}
}
事件实际上是一个私有委托变量加两个方法,这两个方法限定了只能使用+=和-=
而私有委托变量就限定了方法只能在内部调用,而不能在外部调用
委托和事件的区别:
委托是一种类型;而事件是一个私有委托字段加两个方法
7. 委托和事件的底层都依赖反射技术
什么是反射?就是从dll中得到类的信息,创建对象并调用方法
前面是:添加引用,创建对象,通过.方法来调用
反射是:把dll当作文件来读,在不知道类的情况下,调用这个对象
接口规定协议--只要最后实现了接口的内容
8. 如何实现反射
第一种情况
1)如果操作的是dll或exe文件,使用Assembly.LoadFile()方法获得dll数据
注意dll文件必须是全路径Path.GetFullPath()
得到Assembly对象以后,使用GetType获得类型信息(Type)
第二种情况
1)如果使用的是类型而不是文件,使用typeof运算符或对象.GetType()方法
2)得到Type数据以后,可以使用Activator.CreateInstance(Type)创建类型指定的对象
3)使用Type对象的Get系方法获得描述信息
4)使用MethodInfo对象的Invoke方法进行调用
在做架构,在做框架时才会用到反射,做.net framework底层的内容