博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 委托
阅读量:4222 次
发布时间:2019-05-26

本文共 1851 字,大约阅读时间需要 6 分钟。

一、什么是委托?

  初次理解这么抽象的概念确实有点挺难的,如果学过C语言,可能知道C语言里可以把一个方法当做参数来传递,委托大概类似也是这样一个原理。 想象一下,在一个类里面定义一个变量n,这个变量的类型是一个特殊的类型——委托,然后在其它地方通过参数传递,对这个变量n进行了赋值,并且这个“委托”类型变量n是可以当做方法来使用的,就像这样:

n();

  注意:委托是一个引用类型,是一个类。那么定义委托就要定义和类一个级别。什么意思呢!就是类里面可以有其它的类型作为该类的属性,比如定义了一个类A,类A里面定义了int a,bool b,类c 作为三个属性,它们之间是可以“嵌套”使用的。delegate关键字和Class关键字是一个级别的,但委托有比较特殊,像是一个可以有返回值的类,是类却可以当做方法来使用。所以在定义的时候不仅要有delegate关键字,也要有返回类型。

二、下面来看如何使用委托:

1、定义

  它和类是同级别的,可以有参数

//定义一个类	public Class A{}	//定义一个委托	public delegate void MyDel();
2、赋值

  需要对委托进行实例化,就像一个类一样,并且实例化的时候就要给它传递一个方法,不用带括号、带参数,它会自己识别

MyDel myDel=new MyDel(方法名);
3、调用
myDel();

三、下面举个例子来在实战中使用委托:

  我们实现,Form2窗体里的按钮调用Form1窗体里的按钮。

1、新建一个类,将默认的类删掉(或注释),定义委托

//class Class1 { }    public delegate void MyDel(object sender, EventArgs e);    //解释一下委托里面的参数,委托是一个安全类型,这个里面的参数是从 button点击事件的参数一致,因为这个委托要调用点击事件

2、在Form2窗体中

//定义一个委托,作为Form2的一个属性    public MyDel myDel;    private void button1_Click(object sender, EventArgs e)    {
//调用委托 myDel(sender,e); }

3、在Form1窗体中

private void button1_Click(object sender, EventArgs e)    {
//实例化一个委托,并“挂”上一个button2的点击方法 MyDel myDel = new MyDel(button2_Click); //实例化Form2, Form2 f2 = new Form2(); //给Form2里的委托赋值 f2.myDel = myDel; f2.ShowDialog(); } private void button2_Click(object sender, EventArgs e) {
label1.Text = "button2被点击了!!!"; }

效果展示:

在这里插入图片描述

委托还是很好学的,委托也可以“挂”多个方法,这些方法会被依次调用。比如:

public delegate void MyShow();    public void f1()    {
MessageBox.Show("我是f1方法"); } public void f2() {
MessageBox.Show("我是f2方法"); } private void button1_Click(object sender, EventArgs e) {
MyShow myShow = new MyShow(f1); myShow += f2; myShow(); }

在这里插入图片描述

  “一学编程深如海” 哈哈哈,大家一起学习还是挺有意思的。知道“委托”这个词很久了,“忍”了很久都没敢学,今天给思莲解决跨窗体调用方法时,我觉得有必要学习一下了,跟说思莲我也不会委托,怎么办,那就现学一下吧!

转载地址:http://cnqmi.baihongyu.com/

你可能感兴趣的文章
恶心的社会
查看>>
中国式危机公关9加1策略(第五章 慎用信息控制策略)
查看>>
展现自己的人生智慧
查看>>
深入理解java多态性
查看>>
Java新手进阶:细说引用类型
查看>>
osg中使用MatrixTransform来实现模型的平移/旋转/缩放
查看>>
(一) Qt Model/View 的简单说明
查看>>
(二)使用预定义模型 QStringListModel例子
查看>>
UVM:7.4.5 加入存储器
查看>>
UVM:7.5.1 期望值与镜像值
查看>>
UVM:7.5.2 常用操作及其对期望值和镜像值的影响
查看>>
UVM:7.6.1 检查后门访问中hdl 路径的sequence
查看>>
UVM:7.6.2 检查默认值的sequence
查看>>
UVM:7.7.1 使用reg_predictor
查看>>
UVM:7.7.2 使用UVM_PREDICT_DIRECT功能与mirror 操作
查看>>
UVM:7.7.3 寄存器模型的随机化与update
查看>>
UVM:7.7.4 扩展位宽
查看>>
UVM:7.8.1 get_root_blocks
查看>>
UVM:7.8.2 get_reg_by_offset 函数
查看>>
UVM:8.1.1 任务与函数的重载
查看>>