开篇引言:
当我们在窗体下定义变量后,是不是可以轻而易举在此窗体使用这个变量呢?那么如果跨窗体引用呢?其实也简单,普遍操作,定义一个全局变量,但是这样操作不规范,取而代之的是应该在某个窗体定义一个类,然后在类中声明一个静态变量,此时跨窗体使用的时候直接使用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.....>有返回值委托,第一个表示返回值,剩余的表示参数; |
这样的话,我们遇到问题的时候不就想到使用事件了吗?何乐而不为呢?哈哈