美文网首页C#简单总结
3.C# 委托与事件

3.C# 委托与事件

作者: 小王子是偷影子的人 | 来源:发表于2018-07-07 16:51 被阅读0次

委托

delegate是一种可用于封装命名方法或匿名方法的引用类型。委托类似于C++中的函数指针;但是委托是类型安全和可靠的。

委托类型的声明与方法签名相似,它有一个返回值和任意数目任意类型的参数。

委托的声明原型:

delegate <函数返回类型> <委托名> (<函数参数>)

例:

public delegate void TestDelegate(string message);

public delegate int TestDelegate(MyType m,long num);

委托是事件的基础。

通过将委托与命名方法或匿名方法关联,可以实例化委托。

必须使用具有兼容返回类型和输入参数的方法或lambda表达式实例化委托。

为了与匿名方法一起使用,委托和与之关联的代码必须一起声明。

示例:

// Declare delegate -- defines required signature:

delegate double MathAction(double num);

class DelegateTest

{

    // Regular method that matches signature:

    static double Double(double input)

    {

        return input * 2;

    }

    static void Main()

    {

        // Instantiate delegate with named method:

        MathAction ma = Double;

        // Invoke delegate ma:

        double multByTwo = ma(4.5);

        Console.WriteLine("multByTwo: {0}", multByTwo);

        // Instantiate delegate with anonymous method:

        MathAction ma2 = delegate(double input)

        {

            return input * input;

        };

        double square = ma2(5);

        Console.WriteLine("square: {0}", square);

        // Instantiate delegate with lambda expression

        MathAction ma3 = s => s * s * s;

        double cube = ma3(4.375);

        Console.WriteLine("cube: {0}", cube);

    }

    // Output:

    // multByTwo: 9

    // square: 25

    // cube: 83.740234375

}

事件

事件是一种特殊的委托,其实事件就是对委托的封装。

隐式事件声明:

event <委托类型> 事件名

例:

public event CheckDelegate checkEvent;

反射机制中:

可以看到在事件被编译后自动生成了个private的委托实例checkEvent和两个函数add_checkEvent和remove_checkEvent,这两个函数分别对应事件的+=/-=操作,另外可以看到在声明了事件后的确是产生了一个和事件同名私有的委托实例checkEvent,对事件的+=/-=操作都会反映在这个同名委托实例checkEvent上,所以可以在定义事件的类里面直接调用checkEvent()来执行注册函数和对checkEvent使用=号重新赋值,实际上这里操作的并不是checkEvent事件,而操作的是同名委托实例checkEvent,因此隐式声明的事件,其实就是由一个委托实例和两个函数封装而成,所有的操作最终都反映在委托实例上。

显式事件声明:

event <委托类型> 事件名

{

      add

      {

            //将函数注册到自己定义的委托实例

      }

      remove

      {

            //解除函数对自己定义的委托实例的注册

      }

}

显示声明事件就是要自己手动实现隐式声明中的一个委托实例和两个函数。

例:

private CheckDelegate _checkDelete;

public event CheckDelegate checkEvent

{

    add

    {

_checkDelete = Delegate.Combine(_checkDelete, value) as CheckDelegate;

    }

    remove

    {

_checkDelete = Delegate.Remove(_checkDelete, value) as CheckDelegate;

    }

}

反射机制中:

相关文章

  • 3.C# 委托与事件

    委托 delegate是一种可用于封装命名方法或匿名方法的引用类型。委托类似于C++中的函数指针;但是委托是类型安...

  • 原始类型与事情委托

    1.绑定事件: 二、事件冒泡与事件捕获 事件委托 案例见事件委托 计时器

  • 事件与事件委托

    DOM0级事件: 通过javascript制定事件处理程序的传统方式。就是将一个函数赋值给一个事件处理属性。第四代...

  • C#——委托与事件系列一

    本来应该学习泛型与委托的,但是发现C#这里还没有系统的记录过委托与事件,所以先打算把委托与事件补上再继续泛型与委托...

  • 总结.Net基础知识——献给即将入坑的同行们(二期)

    事件是不是一种委托? 委托是一种安全的函数指针,事件是一种消息机制 委托与事件是什么关系?为什么要使用委托 委托提...

  • 委托与事件

    两个窗体form1和form2点击form1按钮跳转到form2点击form2按钮,form1中按钮文字变化 fo...

  • 事件与委托

    委托是一个类, 它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递 可以在两个类之间传递方法,破坏了...

  • 委托与事件

    1.直接使用delegate 不废话,直接上代码 运行结果 2.使用Action 结果一样

  • 委托,Lambda,事件

    委托 声明委托 Lambda 事件与委托的区别 事件不能再类的外部调用,可以在外部注册 委托可以在类的外部调用,可...

  • 事件委托

    ------------------事件委托----------------- 事件: 事件委托: 原理: 冒泡 ...

网友评论

    本文标题:3.C# 委托与事件

    本文链接:https://www.haomeiwen.com/subject/chcguftx.html