文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#中委托的概念与使用方法是什么

2023-07-05 07:08

关注

本篇内容主要讲解“C#中委托的概念与使用方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中委托的概念与使用方法是什么”吧!

委托的概念

委托这个名字取的神乎其神的,但实质是函数式编程,把函数作为参数传递给另一个参数。对于C语言程序员来说,就是把函数指针当作参数传递给另一个函数。

唯一需要注意的是,C#毕竟是强类型语言,用于委托的函数,也相当于变成了一种可以被传递的变量,所以在创建以及调用之前,需要声明其数据类型

delegate int Op(int a, int b);

这个委托是一种需要传入两个整型参数的函数,返回值也是整数。接下来对这个委托进行实例化,最终代码如下

int add(int a, int b){    return a + b;}var addTest = new Op(add);void calc(Op func, int a, int b){    Console.WriteLine($"func({a},{b})={func(a,b)}");}calc(addTest, 2, 3);delegate int Op(int a, int b);

事先说明一下,本文所有代码均在.Net6的顶级语句中实现,顶级语句需要把delegate声明放在最下面。

其中,add是一个十分质朴的函数,没什么可说的;addTest是一个内置了add了Op对象,其功能与add是相同的。

calc是一个以Op对象为参数的函数,在这个函数中,通过Op对象func,计算了另外两个参数a和b。

最后,调用了calc函数,将addTest作为参数,实质上是计算了add(2,3),并打印了这个结果。

func(2,3)=5

>“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

多播委托

所谓多播委托,就是一个委托中通过+=运算符添加多个函数。当然也可以通过-=运算符将原本添加的函数删除掉。

为了演示这个功能,将上述代码稍作更改。

int add(int a, int b){    Console.WriteLine($"{a}+{b}={a+b}");    return a + b;}int minus(int a, int b){    Console.WriteLine($"{a}-{b}={a-b}");    return a-b;}void calc(Op func, int a, int b){    func(a,b);}Op opTest = add;opTest += minus;opTest += add;opTest += minus;calc(opTest, 3, 4);Console.WriteLine("减去一个minus");opTest -= minus;calc(opTest, 3, 4);delegate int Op(int a, int b);

其中Op opTest=add的写法等价于Op opTest = new OpTest(add),但若省略new,则不可写为var opTest = add,这个时候没法进行类型推断。

输出结果为

3+4=7
3-4=-1
3+4=7
3-4=-1
减去一个minus
3+4=7
3-4=-1
3+4=7

由此可知,委托在调用的时候,会按照+=的先后顺序调用函数,并将最后一个调用的函数作为返回值。

而函数在委托中以栈的方式存放,-=会先减去后存入委托中的函数。

拖动按钮

多播委托在GUI编程中最为常用,尤其是拖动控件时。拖动控件的流程包括三个步骤

则对于一个控件来说,其绑定的事件会随着鼠标的点击情况而发生变化

0. 鼠标未点击时,控件需要响应鼠标点击事件

接下来,实操一下,简单起见,GUI采用winForm,在新建项目之后,拖动一个按钮到窗口上,右键按钮->属性,可以更改一下名字和内容,然后点击右下角属性

栏的小闪电,然后注册MouseDown事件,输入btnTest_MouseDown并按下回车之后,IDE会自动来到代码界面,并出现一个空的委托函数。

private void btnTest_MouseDown(object sender, MouseEventArgs e){}

为了理解这个东西的作用,可以在解决方案资源管理器中找到Form1.Designer.cs文件,点进去之后可以看到下面这行代码

this.btnTest.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnTest_MouseDown);

换言之,btnTest.MouseDown就是一个多播委托,刚刚我们的行为,为其注册了一个名为btnTest_MouseDown的实现,尽管这个实现现在还是空的。

若想拖动一个控件,第一步就是按下鼠标,按下鼠标之后,需要再注册两个委托,分别再拖动鼠标和松开鼠标时起作用;而松开鼠标和按下鼠标的作用刚好相反,要求取消注册拖动事件,所以下面分别实现这三个功能。

private void btnTest_MouseDown(object sender, MouseEventArgs e){   btnTest.MouseMove += btnTest_MouseMove;   btnTest.MouseLeave += btnTest_MouseLeave;}private void btnTest_MouseLeave(object sender, EventArgs e){   btnTest.MouseMove -= btnTest_MouseMove;   btnTest.MouseLeave -= btnTest_MouseLeave;}private void btnTest_MouseMove(object sender, MouseEventArgs e){   int dh = btnTest.Height / 2;   int dw = btnTest.Width / 2;   btnTest.Top = MousePosition.Y - this.Top - dh;   btnTest.Left = MousePosition.X - this.Left - dw;}

上面需要注意一点,MouseLeave和MouseMove, MoseDown是不同类型的委托,故而创建函数的参数类型是不同的。

btnTest.Top为按钮顶端距离窗口顶端的距离;MousePosition.Y表示鼠标距离屏幕顶端的距离;this.Top表示窗口顶端距离屏幕顶端的位置,最后再减去一个按钮高度的一半,相当于是把按钮的中心移动到鼠标光标处。这种逻辑过于简单粗暴,实际工作时不会用到,之所以这么写是因为简单。

效果如下

C#中委托的概念与使用方法是什么

到此,相信大家对“C#中委托的概念与使用方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯