C#基础加强第五天--委托,事件与反射

委托和反射
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底层的内容
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值