C#的匿名委托 和 Java的匿名局部内部类

时间:2022-12-16 00:25:19

.NET:C#的匿名委托 和 Java的匿名局部内部类

目录

背景实验备注

背景返回目录

这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一个假设:Java的字节码只支持静态嵌套类,内部类、局部内部类和匿名局部内部类都是编译器提供的语法糖,这个假设目前没法验证(看不懂字节码),本文先来看一下C#是如何为我们提供的这种语法糖。

实验返回目录

测试代码

C#的匿名委托 和 Java的匿名局部内部类
 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6
7 namespace CSharpStudy
8 {
9 class Program
10 {
11 static void Main(string[] args)
12 {
13 int i = 0;
14
15 Action action1 = () =>
16 {
17 System.Console.WriteLine(i);
18 };
19
20 i++;
21
22 Action action2 = () =>
23 {
24 System.Console.WriteLine(i);
25 };
26
27 i++;
28
29 action1();
30 action2();
31 }
32 }
33 }
C#的匿名委托 和 Java的匿名局部内部类

输出

C#的匿名委托 和 Java的匿名局部内部类

使用Reflector进行反编译

C#的匿名委托 和 Java的匿名局部内部类

C#的匿名委托 和 Java的匿名局部内部类
 1 private static void Main(string[] args)
2 {
3 <>c__DisplayClass2 CS$<>8__locals3 = new <>c__DisplayClass2();
4 CS$<>8__locals3.i = 0;
5 Action action1 = new Action(CS$<>8__locals3.<Main>b__0);
6 CS$<>8__locals3.i++;
7 Action action2 = new Action(CS$<>8__locals3.<Main>b__1);
8 CS$<>8__locals3.i++;
9 action1();
10 action2();
11 }
C#的匿名委托 和 Java的匿名局部内部类
C#的匿名委托 和 Java的匿名局部内部类
public void <Main>b__0()
{
Console.WriteLine(this.i);
} public void <Main>b__1()
{
Console.WriteLine(this.i);
}
C#的匿名委托 和 Java的匿名局部内部类

备注返回目录

应该一看就明白了,也可以想象Java也是这么处理的(匿名局部内部类),局部内部类和内部类不过是一种类似的语法糖机制,最近发现.Net、Java和Go提供的闭包机制都是基于编译器实现的,这和动态语言的闭包机制有明显的不同。

不知道我对Java做的假设是否正确,后面深入学习以后再做断言。

C#的匿名委托 和 Java的匿名局部内部类的更多相关文章

  1. &period;NET:C&num;的匿名委托 和 Java的匿名局部内部类

    背景 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一个假设:Java的字节码只支持静态嵌套类,内部类.局部内部类和匿名局部内部类都是编译 ...

  2. Java中的局部内部类

    package Smoke; public class Inner { private int num = 3; class Limian{ public void show(){ //内部类可以访问 ...

  3. 帮助理解委托、匿名委托、Lambda表达式还有事件

    写了一个小程序,能够很好的认识到这三个的用法 namespace Lambda { /// <summary> /// 实现根据指定运算形式 输出结果 /// </summary&g ...

  4. 匿名&sol;局部内部类访问局部变量时,为什么局部变量必须加final

    我们都知道方法中的匿名/局部内部类是能够访问同一个方法中的局部变量的,但是为什么局部变量要加上一个final呢? 首先我们来研究一下变量生命周期的问题,局部变量的生命周期是当该方法被调用时在栈中被创建 ...

  5. 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底

    本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...

  6. C&num;中使用委托、接口、匿名方法、泛型委托实现加减乘除算法

    使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...

  7. C&num;学习之初步理解委托、事件、匿名方法和Lambda

    最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对 ...

  8. 使用匿名委托,Lambda简化多线程代码

    使用匿名委托,Lambda简化多线程代码   .net中的线程也接触不少了.在多线程中最常见的应用莫过于有一个耗时的操作需要放到线程中去操作,而在这个线程中我们需要更新UI,这个时候就要创建一个委托了 ...

  9. 委托、匿名委托和lambda表达式

    1.委托 在.NET中,委托有点类似于C/C++中的函数指针,但与指针不同的是,委托是一种安全的类型,那么我们就以实现两个数的差为例,先声明一个成员方法: public int CompareTwoV ...

随机推荐

  1. C&num; 不支持关键字&colon; &OpenCurlyDoubleQuote;&period;&semi;database”。

    解决方案分析:这个一定是链接字符串有问题,核对web.config 和程序的字符串是否有误

  2. hdu 2036

    Ps:  - -感觉这道题完全就是数学题...就是求知道每个顶点的坐标,然后求这个多边形的面积... 代码:#include "stdio.h"#include "std ...

  3. 开发设计模式(六)多例模式(Multition Pattern)

    多例模式实际上就是单例模式的扩充,多例模式又划分为有上限多例模式和无上限多例模式两种,有上限多例模式中的多例类的实例是有上限的,当这个多例类中的上限数值上等于 1 时,此时,多例类退化回到了单例类:而 ...

  4. Linux无处不在

    Linux is Everywhere从*.教育.商业和非盈利组织.科研机构几个方面展示了现在都有哪些地方用了Linux.

  5. iOS键盘遮挡输入框,输入区域自动上移

    在iOS开发过程当中,遇到关于键盘遮挡输入框的问题,经过网络参考与实践,总结如下: 登录窗口,上下放置两个UITextField,一个用户名,一个密码,放置的在屏幕下方1/3处,当点击用户名时,自动弹 ...

  6. 问题记录-运行Tomcat,项目程序没有响应

    问题描述:运行Tomcat,项目程序没有响应原因在于 修改成一致路径即可解决.

  7. Microsoft Visual Studio &vert; VS打开解决方案时加载失败,或者出现错误提示

    Microsoft Visual Studio | VS打开解决方案时加载失败,或者出现错误提示 1.加载失败并且输出状态栏也没什么错误提示的话,往往是因为一个低版本VS2010.VS2012等打开了 ...

  8. 【问题解决方案】AttributeError&colon; module &&num;39&semi;pygal&&num;39&semi; has no attribute &&num;39&semi;Worldmap&&num;39&semi;

    <Python编程:从入门到实践>- 16章-16.2.5制作世界地图 import pygal 后报如标题的error 参考CSDN 解决:AttributeError: module ...

  9. luogu P2662 牛场围栏

    传送门 因为一个木板可以切掉最多\(m\),所以可以先预处理哪些长度的木板可用,开个桶,然后对\([l-m,l]\)打标记,再把打了标记的数取出来 假设可用长度\(a_1,a_2,,,a_n\)从小到 ...

  10. CentOS 上开启 BBR 加速

    BBR 算法需要 Linux 4.9 及以上的内核支持,所以想要使用该方式的需要先升级内核版本. 在 Cent OS 7 上的 Linux 内核是 3.10, 使用 uname -r 查看内核版本 [ ...