C# 局部函数与事件

原创 2017年10月30日 20:52:29

本文告诉大家使用局部函数可能遇到的坑。

在以前,如果有一个事件public event EventHandler Foo和一个函数private void Program_Foo(object sender, EventArgs e)那么使用函数监听事件是很简单的,当然从事件取消函数也是很简单。请看下面代码

            for (int i = 0; i < 100; i++)
            {
                Foo -= Program_Foo;
                Foo += Program_Foo;
            }
            Console.WriteLine(Foo.GetInvocationList().Length);

结果输出 1

因为GetInvocationList是获得事件有多少监听,从上面代码看到,只有一个监听。

如果把函数修改为局部,请看代码

            for (int i = 0; i < 100; i++)
            {
                Foo -= Program_Foo;
                Foo += Program_Foo;
            }
            Console.WriteLine(Foo.GetInvocationList().Length);

            void Program_Foo(object sender, EventArgs e)
            {

            }

现在他会输出什么?

看起来没有问题,但是如果再做出一些修改,请看下面代码

            for (int i = 0; i < 100; i++)
            {
                F();
            }
            Console.WriteLine(Foo.GetInvocationList().Length);

        private static void F()
        {
            Foo -= Program_Foo;
            Foo += Program_Foo;

            void Program_Foo(object sender, EventArgs e)
            {

            }
        }

现在输出是什么?

还是 1

所以可以直接使用局部函数

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

版权声明:http://blog.csdn.net/lindexi_gd 本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C#构造函数

C#高级(三)构造函数 构造函数是和类名相同的类的一个方法,如果没有显式的声明,在系统会在编译的时候,自 动生成一 个不带参数的,不执行任何动作的构造函数。 但如果显式的声明了构造函数,系统就不...

C#处理鼠标和键盘事件

  • 2009年06月08日 23:46
  • 26KB
  • 下载

c#事件响应机制csharp响应机制

  • 2010年08月24日 14:02
  • 37KB
  • 下载

C#和Win32 API函数

C#并不像C++,拥有属于自己的类库。C#使用的类库是.Net框架为所有.Net程序开发提供的一个共有的类库――.Net FrameWork SDK。虽然.Net FrameWork SDK内容十分庞...
  • sevenkj
  • sevenkj
  • 2017年04月04日 21:13
  • 208

应用C#进行事件处理

  • 2009年06月23日 19:56
  • 22KB
  • 下载

详细讲解c#常用函数

  • 2009年07月15日 16:29
  • 70KB
  • 下载

是什么让C#成为最值得学习的编程语言

是什么让C#成为最值得学习的编程语言,阅读完本文,你就知道。

<转>c#调用C++DLL类型转换

//c++:HANDLE(void   *)          ----    c#:System.IntPtr         //c++:Byte(unsigned   char)     --...
  • qrx2013
  • qrx2013
  • 2014年02月14日 22:02
  • 395

Objective-C中#import与@class如何规避多文件结构导致的重复包含

Objective-C中#import如何规避多文件结构导致的重复包含;以及@class作用   C/C++中使用#include来包含头文件,缺点就是同一个头文件可能被...

C#本质论(第3版)笔记

C#本质论(第3版) 跳转至: 导航、 搜索 目录 1 C#概述2 数据类型3 运算符和控制流4 方法和参数5 类6 继承7 接口8...
  • cteng
  • cteng
  • 2014年10月31日 17:46
  • 1268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 局部函数与事件
举报原因:
原因补充:

(最多只允许输入30个字)