现代操作系统应用开发课程学习

今天开始了现代操作系统应用开发课程的正式学习,所使用到的编程语言是C#,其中有一个重要的概念是委托和事件,对于刚学习这个概念的我不是很理解他的意义和使用方式,经过一番各处学习后对这个概念有了一些初步的认识,在此将我自己的认识写下,希望与各位朋友探讨一番。

一、函数指针
首先在观察了课件上的例子之后,我很快意识到委托与C语言中的函数指针非常相似。
函数指针的作用是这样的:
一个函数有一些参数构成参数列表,我们一般使用的是一些基础变量或自定义的结构体或对象。
当我们遇到这样的情况,需要写一个函数叫计算,它可以计算加法减法乘法除法,例如:

int calculate(int num1, int num2) {}

我们如何知道传入的num1和num2要做什么运算呢,有一个办法是把要做的运算函数作为一个参数也传入进去。想要将一个函数作为参数传递进参数列表,就要用到函数指针。
我们的函数现在变成这样:

int calculate(int num1, int num2, int (*f) (int, int)) {return (*f)(num1,num2);}

这里的 int (*f)(int, int) 代表的是一个函数指针f 这个指针指向的是返回类型为int的参数列表为(int, int)的函数。而使用函数指针和使用普通的变量指针类似(*f)表示取出该函数,后面和函数调用一样要加上参数(num1,num2)。
如果我们想要用该函数来实施加法运算,可以这样使用:

int add(int num1, int num2) {return num1+num2;}
calculate(1,2,add); // 3

这是直接将函数名传入,说明函数名本质也是一个函数指针。
也可以这样使用:

int (*f) (int,int);
f = add;
calculate(1,2,f); // 3

将函数名传递给函数指针,再使用该指针。
使用函数指针的好处在与可以使得程序更加的灵活。就像这个例子,你可以先写一个calculate函数来囊括大部分计算,然后对每一个计算编写对应的函数。

二、委托
了解的函数指针是什么,那么委托也很容易理解了,委托就是是以面向对象的方式封装了函数指针。
委托的关键字是delegate。
使用委托类可以定义要传递的函数的返回类型和参数格式。
模仿上面的函数指针写出来的委托应该是这样的:

private static delegate int CalculateFunction(int num1, int num2);
// 参考 int (*f) (int,int);

public int calculate(int num1, int num2, CalculateFunction f) { return f(num1, num2); }
// 参考 int calculate(int num1, int num2, int (*f) (int, int)) {return (*f)(num1,num2);}

public int add(int num1, num2) { return num1+num2; }
static void main() { calculate(1,2,add); } // 3

三、事件
明白了委托之后我们来理解一下事件。我们从图形界面的一个简单的例子来认识一下,当你鼠标点击一个按钮,就会弹出一个对话框,这件事是怎么发生的呢?
事件编程的方式是这样实现的,当鼠标点击了按钮,按钮就会触发一个事件信号,而系统的某个部分会监听着对应的信号,一旦接收到对应的信号,该部分就会对这个信号进行响应,如弹出一个对话框。那我们应该怎么实现这样的过程呢?
分析上述过程,我们需要两个部分,一个部分是产生事件信号的,另一个部分是监听事件信号的。
产生事件信号的:
internal class ButtonClickedMonitor {
    // 想要传递事件信号就得用到委托
    // 这里我们声明了一个委托 由于该事件信号不传递额外的消息 所以用基础的EventArgs类
    public delegate void ButtonClicked(object sender, EventArgs e);
    // 接下来声明一个事件信号 它需要知道传递的委托的格式
    public event ButtonClicked ButtonClickedHandler;
    // 接下来写检测到按钮点击后发送该事件信号
    public Run() {
       while (CheckedButtonClick() == true)// 这个函数是我自己编的
       ButtonClickedHandler(this, EventArgs.Empty); // ButtonClickedMonitor的实例对象发出这个事件信号
     }
}
监听事件信号的:
internal class ButtonClickedListener{
    // 由于是专门监听该事件的,就直接在构造函数里添加对对应事件的监听
    public ButtonClickedListener(ButtonClickedMonitor monitor) {
        monitor.ButtonClickedHandler += new ButtonClickedMonitor.ButtonClicked(this.HandleFunction); // +=是向发射事件信号的对象添加监听它的监听成员
    }
    private HandleFunction(object sender, EvenArgs e) {
    //接收到事件信号 创建一个对话框
    }
}
运行过程如下:
static class Program {
    static void Main() {
        // 创建一个监视按钮被点击的监视器 也就是事件信号的发生者
        ButtonClickedMonitor monitor = new ButtonClickedMonitor();
        // 创建一个监听该事件的监听者 也就是事件信号的接收者
        ButtonClickedListener listener = new ButtonClickedListener();
        // 运行监视器
        monitor.run();
     }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值