.NET:C#的匿名委托 和 Java的匿名局部内部类
背景
这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一个假设:Java的字节码只支持静态嵌套类,内部类、局部内部类和匿名局部内部类都是编译器提供的语法糖,这个假设目前没法验证(看不懂字节码),本文先来看一下C#是如何为我们提供的这种语法糖。
实验
测试代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CSharpStudy
{
class Program
{
static void Main(string[] args)
{
int i = ; Action action1 = () =>
{
System.Console.WriteLine(i);
}; i++; Action action2 = () =>
{
System.Console.WriteLine(i);
}; i++; action1();
action2();
}
}
}
输出

使用Reflector进行反编译

private static void Main(string[] args)
{
<>c__DisplayClass2 CS$<>8__locals3 = new <>c__DisplayClass2();
CS$<>8__locals3.i = ;
Action action1 = new Action(CS$<>8__locals3.<Main>b__0);
CS$<>8__locals3.i++;
Action action2 = new Action(CS$<>8__locals3.<Main>b__1);
CS$<>8__locals3.i++;
action1();
action2();
}
public void <Main>b__0()
{
Console.WriteLine(this.i);
} public void <Main>b__1()
{
Console.WriteLine(this.i);
}
备注
应该一看就明白了,也可以想象Java也是这么处理的(匿名局部内部类),局部内部类和内部类不过是一种类似的语法糖机制,最近发现.Net、Java和Go提供的闭包机制都是基于编译器实现的,这和动态语言的闭包机制有明显的不同。
不知道我对Java做的假设是否正确,后面深入学习以后再做断言。
.NET:C#的匿名委托 和 Java的匿名局部内部类的更多相关文章
- C#的匿名委托 和 Java的匿名局部内部类
.NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一 ...
- Java中的局部内部类
package Smoke; public class Inner { private int num = 3; class Limian{ public void show(){ //内部类可以访问 ...
- 帮助理解委托、匿名委托、Lambda表达式还有事件
写了一个小程序,能够很好的认识到这三个的用法 namespace Lambda { /// <summary> /// 实现根据指定运算形式 输出结果 /// </summary&g ...
- 匿名/局部内部类访问局部变量时,为什么局部变量必须加final
我们都知道方法中的匿名/局部内部类是能够访问同一个方法中的局部变量的,但是为什么局部变量要加上一个final呢? 首先我们来研究一下变量生命周期的问题,局部变量的生命周期是当该方法被调用时在栈中被创建 ...
- 委托、匿名委托、Lambda 表达式、Expression表达式树之刨根问底
本篇不是对标题所述之概念的入门文章,重点在阐述它们的异同点和应用场景.各位看官,这里就不啰嗦了,直接上代码. 首先定义一个泛型委托类型,如下: public delegate T Function&l ...
- C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法
使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...
- C#学习之初步理解委托、事件、匿名方法和Lambda
最经在学习LinqtoSql,然后扯到Lambda表达式,然后扯到匿名方法,然后扯到委托,最后扯到事件处理...后来发现对委托这个概念和事件处理这个过程理解得不是很清晰,遂得一下学习笔记.那里说得不对 ...
- 使用匿名委托,Lambda简化多线程代码
使用匿名委托,Lambda简化多线程代码 .net中的线程也接触不少了.在多线程中最常见的应用莫过于有一个耗时的操作需要放到线程中去操作,而在这个线程中我们需要更新UI,这个时候就要创建一个委托了 ...
- 委托、匿名委托和lambda表达式
1.委托 在.NET中,委托有点类似于C/C++中的函数指针,但与指针不同的是,委托是一种安全的类型,那么我们就以实现两个数的差为例,先声明一个成员方法: public int CompareTwoV ...
随机推荐
- python之pandas&&DataFrame
1.Series Series是一个一维数组 pandas会默认从0开始作为Series的index >>> test = pd.Series(['num0','num1','nu ...
- C语言俄罗斯方块
#include <windows.h> #include <stdio.h> #include <time.h> #include <conio.h> ...
- linux sed命令查询结果前后批量追加内容(html文件批量修改css,js等文件路径)
1.需求:linux使用shell命令查询结果前后批量追加内容 例如:我需要在当前目录下所有的css文件路径前追加域名 我想的是用sed替换去实现,鲍哥的思路是用for循环 1.1方法1:鲍哥的for ...
- for循环练习题(共六道题)
第一题: 假设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码(password),最多只能输入三次,超过3次则提示用户“密码错误,请取卡”结束交易.如果用户密码正确,再提示用户输入取款金额 ...
- Python全栈开发之7、模块和几种常见模块以及format知识补充
一.模块的分类 Python流行的一个原因就是因为它的第三方模块数量巨大,我们编写代码不必从零开始重新造轮子,许多要用的功能都已经写好封装成库了,我们只要直接调用即可,模块分为内建模块.自定义的模块. ...
- lr11 controller打开提示cannot initialize driver dll,exiting
解决:在win7要以管理员身份运行才行的 问题2:在使用loadrunner时,从vuser generator启动controller的时候可能出现:由于另一个程序正在运行中 此操作无法完成.请选择 ...
- Codeforces Round #490 (Div. 3) F - Cards and Joy
F - Cards and Joy 思路:比较容易想到dp,直接dp感觉有点难,我们发现对于每一种数字要处理的情况都相同就是有 i 张牌 要给 j 个人分, 那么我们定义dp[ i ][ j ]表示 ...
- poj2956 Repeatless Numbers(枚举|BFS)
题目链接 http://poj.org/problem?id=2956 题意 如果一个数中的每一位都是不同的,那么这个数叫做无重复数,如11是有重复数,12是无重复数.输入正整数n(1<=n&l ...
- 【WPF】城市级联(XmlDataProvider)
首先在绑定的时候进行转换: public class RegionConverter : IValueConverter { public object Convert(object value, T ...
- Scrapy 笔记(二)
一个scrapy爬虫知乎项目的笔记 1.通过命令创建项目 scrapy startproject zhihucd zhihuscrapy genspider zhihu www.zhihu.com(临 ...