C#中委托和事件

开篇引言:

当我们在窗体下定义变量后,是不是可以轻而易举在此窗体使用这个变量呢?那么如果跨窗体引用呢?其实也简单,普遍操作,定义一个全局变量,但是这样操作不规范,取而代之的是应该在某个窗体定义一个类,然后在类中声明一个静态变量,此时跨窗体使用的时候直接使用ClassName.StaticName;既然变量可以这么操作,那么我如果想方法同样也可以进行这样的操作呢;


结果是.....,不能,指定没有这种操作,那么委托+事件又是弄啥来?当然是逆天操作解决问题的,也就是上面结尾的问题;


解说:

首先如果是在本窗体的话,和变量无恙,直接调用此方法即可;那么跨窗体引用呢,实例化包含此方法的窗体,然后调用它的方法,好像挺不错的,毕竟差点和“层级架构”之间传值一样了,不过我们要区分,架构之间归为类与类之间,但是这里可是窗体与窗体之间,耦合性大大增强;


那么如果就想窗体之间调用方法呢?这可咋办,委托此时便应运而出,轻松解决这个“两个窗体耦合”的问题;


示例说明: 

A窗体预先定义委托,在B窗体中(实例化A窗体,然后委托B窗体的方法),一旦在A窗体中调用委托的时候,进而把B窗体的方法也触发了;

      (1)//在一个新建的类里面声明一个委托类型
        public delegate void testDelegate();

      (2)//在Form4窗体实例化testDelegate这个委托
        public testDelegate myTest;

      (3)//在Form3窗体中实例化Form4窗体,然后委托Form3窗体的方法
        private void SetText()//Form3中的方法
        {
             textBox1.Text = "2";
        }
        private void button2_Click(object sender, EventArgs e)//Form3中的方法
        {
            Form4 form4 = new Form4();
            form4.myTest = SetText;委托承载方法标识
            form4.myTest();//委托是实现了,但是竟然可以在Form3中调用Form4的委托方法,不安全
            form4.Show();
        }

      (2)//在Form4窗体实例化testDelegate这个委托
        public event testDelegate myTest;
      (3)//那么此时我们需要在委托前面用Event类型修饰,将委托对象变为事件
        private void button2_Click(object sender, EventArgs e)//Form3中的方法
        {
            Form4 form4 = new Form4();
            form4.myTest += SetText;//事件承载方法的时候必须为+=符号
            form4.myTest();//此时这里指定报错,因为事件不允许在外界被调用
            form4.Show();
        }

      (4)//但是这样的话,为了生命一个委托还需要新建一个类,好像挺麻烦的,.Net平台内置了两个委托
        public Action<T> myTest2;//无返回值,并且只有一个参数的委托
        public Func<T1,T2,T3....> myTest3;//前面T都是参数,最后一个T是返回值的类型

实例化对象

Class strName=new Class();

委托

实例化“委托对象”(预先定义委托)

public testDelegate myTest3;

委托对象

事件

public event testDelegate myTest;

优点:

多用于处理信息同步(后台数据库),非窗体界面,同时解决耦合性问题;

缺点:

1:如果把委托声明为Private的话,外界不可以被赋值(方法),更不会在外界被调用;那么此时好像委托在自己窗体无任何作用;

2:那么如果声明为Public的话,外界可以委托方法,但是引来的问题就是外界同样可以调用其他窗体声明的委托;安全性降低。

3:委托同样也可以进行“=”赋值或者“+=”赋值,因此同样容易误操作;


                                   那么?就此结束了,不不不不不,“事件”这个名词出现在我们面前;


优点:

解决了委托中的不安全性和误操作两项缺点,我想这就够了,这两条理由足以说服我用它;并且也不会很麻烦,在原有委托的基础上,添加“类型”Event后,那么此时就可以使用了;

但是在使用的过程中,我们需要单独声明一个类来声明一个委托类型,方便使用的时候实例化委托对象;此时好像又有些没必要,不用怕!.Net平台内置已经为咱封装好了两个委托,考虑的甚是周全,解决单独新建一个类来声明委托;

 

                                                           Action<T>无返回值,但是有参数,T表示传的参数
                                              Func<T1,T2,T3.....>有返回值委托,第一个表示返回值,剩余的表示参数;

                   

                       这样的话,我们遇到问题的时候不就想到使用事件了吗?何乐而不为呢?哈哈

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值