1. 自动属性初始化 (Initializers for auto-properties)

1.1 C#6.0 之前的写法

public class FirstExperience
{private string _stringAutoProp = "自动初始化属性";public string StringAutoProp{get{ return _stringAutoProp; }set{ _stringAutoProp = value; }}
}

1.2 C#6.0 中的写法

public class FirstExperience
{public string StringAutoProp { get; set; } = "自动初始化属性";
}

1.3 反编译效果


从反编译中我们发现多了个私有字段this.<StringAutoProp>k__BackingField;并在默认的构造函数中将“自动初始化属性”赋值给了这个字段,那么可以推断出IL中肯定会有这个匿名字段的定义,让我们再来看看IL中的体现:

用上面的两张图我们可以得出以下结论

其实自动初始化属性就是在CLR中体现就是创建私有的匿名字段,然后在构造函数中为这个匿名属性赋值,而属性的getSet方法其实就是在操作这个匿名属性。

2. 只读属性的初始化(Getter-only auto-properties)

2.1 C#6.0 之前的写法

public FirstExperience(int id)
{_id = id;
}
private readonly int _id;public int ID
{get { return _id; }
}

2.2 C#6.0 中的写法

public int ReadonlyProp { get; }public FirstExperience(int _readonlyProp)
{ReadonlyProp = _readonlyProp;
}

2.3 反编译效果


从反编译的结果我们看到构造函数中将传进来的_readonlyProp赋值给this.<ReadonlyProp>k__BackingField字段,而属性的get方法操作的就是这个由编译器生成的字段,而在ReadonlyProp属性的get方法中打了CompilerGenerated这个特性标签,这个标签其实就是区分编译器生成的元素与用户生成的元素,关于这个特性请移步到此。由此可以推断IL中所做的操作与自动初始化属性一致

3. 用Lambda作为函数体 (Expression bodies on method-like members)

3.1 C# 6.0 之前的写法

 public override string ToString()
{return string.Format("{0}",StringAutoProp);
}

3.2 C# 6.0 写法

public override string ToString() => string.Format("{0}", StringAutoProp);

在6.0 语法中我们看到可以使用lambda表达式直接作为函数体,那么编译器到底为我们做了什么呢?

3.3 反编译效果

从反编译中我们可以看出编译器编译的时候把lambda函数直接编译成方法体,那么再看看IL的区别了。

从上面两张图中可以看出除了标注堆栈标注刻度不同以外,看不出有什么差别。我也不是太明白这个地方,求园内的大牛解释解释!

4. 空值判断 (Null-conditional operators)

4.1 恶心的写法

if(xxx !=null)
{xxx.ToString();
}

这种写法相信有非常多的朋友用过,经常为了一个是否为空的问题搞得代码非常难看,
举个栗子:我们需要获取集合或者是字符喘的长度

if(parem!=null)
{return parem.Length;
}
return null;

这样的写法实在太恶心了,在6.0语法中我们可以这么写

public int? GetListCount(List<int> list)
{return list?.Count();
}

4.2 实际应用的栗子

在实际应用中,经常会用到委托,而在之前我们需要调用委托时则需要判断委托是否为空如下代码:

public void Test(TestNew test)
{if (test != null){test.Invoke();}
}

对于强迫症的我来说这样太恶心了,于是乎利用6.0的语法开始改造

public void Test1(TestNew test)
{test?.Invoke();
}

4.3 根据上面的栗子进行反编译

从上图反编译效果可以看到两个方法基本没有差别,接下来看看IL中有什么差别:

上图为6.0语法委托调用的IL图,发现核心还是brtrue.s做IF判断决定执行流

5. nameof表达式 (nameof expressions)

5.1 在实际项目的方法中我们经常需要这样去做参数判断

public void MyMethod(string name)
{if (string.IsNullOrEmpty(name)){throw new ArgumentNullException("name");}
}

上面代码中的name是我们手写的字符串,在给参数name改名时经常会忘记改下面的字符串name,然而 6.0 解决了这个问题:

public void MyMethod(string name)
{if (string.IsNullOrEmpty(name)){throw new ArgumentNullException(nameof(name));}
}

5.2 nameof的反编译

上图中nameof(name)被替换成了字符串name,就如同常量一样。继续来看看IL做了什么:

从IL中我们可以看到它是直接ldstr,既不是反射也不是拿变量的内存值,在实际运用中有时候我们会通过Type来获取他的类名或者是直接写死的但是这样通过反编译后会发现Type.Name在IL中其实是通过反射来获取,而直接写死的方式,在IL中其实就是定义一个变量到堆栈中然后再引用进去。
nameof(name)具有这两种的的有点,灵活而且相对于type和写死的方式性能更高了。

6. 小结

其实6.0中还有很多新的语法糖,在这里就不一一介绍了,等不忙了,我在把其他的新的语法糖写出来

非常感谢您花时间读完这篇文章,如果您觉得此文不错,请点一下“推荐”按钮,您的“推荐”就是对我最大的鼓励以及不懈努力的肯定。本文版权归作者和博客园所有,来源网址:http://www.cnblogs.com/Wesley-Zen/欢迎各位转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利以及小小的鄙视。

转载于:https://www.cnblogs.com/Wesley-Zen/p/4847101.html

从反编译的角度去观察C#6.0相关推荐

  1. 教你使用 Reflector中的Reflexil插件反编译.NET,修复Help Viewer v2.0 - Error: .cab未经Microsoft签名

    教你使用 Reflector中的Reflexil插件反编译.NET,修复Help Viewer v2.0 - Error: Cab was not signed 1. 下载.NET Reflecto并 ...

  2. 反编译之脱去乐固加固的壳

    前言:本文主要是介绍脱壳的方法,并不涉及原理,如果想要了解加固及脱壳的原理,请移驾别处. 写本文的原因   最近遇到一款app需要开通Vip才能进行视频下载,像我这种贫穷的程序员怎么能忍,既然没钱解决 ...

  3. Python反编译pyinstaller打包的exe文件 从0开始(未加密篇)

    因为pyinstaller方便.兼容性相对较好,所以我们会经常见到一些用pyinstaller打包的Python程序,在这里我们了解一下如何对这些打包好的exe文件进行反编译(即反编译出.py文件), ...

  4. php zend optimizer 解密,PHP反编译工具(Mr.DeZend GUI)下载 v1.0

    Mr.DeZend GUI 是一款针对PHP被zend加密的解密工具 请运行Gui.exe进行DeZend操作,如果DeZend失败,请查看下文: 需求: 1.操作系统:Windows 2000/XP ...

  5. 反编译之将脱壳后的dex文件重新打包成apk

    前言:通过上一篇文章反编译之脱去乐固加固的壳,已经可以拿到dex文件了,那么我们怎么将dex文件重新打包回新的apk呢?如果有这样的疑问,就看看这篇文章吧!一定会帮到你的! 得到dex文件之后该做什么 ...

  6. 02_反汇编_反编译

    实际上安卓的应用都是zip包,只不过把zip扩展名修改了,修改成了APK.所以如果你想拿到它的图片的话,实际上特别简单,你就把它这个.apk换成.zip.换成.zip之后这里的图片资源就都可以拿到了. ...

  7. Android反编译分析工具

    通常我们会看到好的APP,都想知道内部结构是如设计的,希望能借鉴一些好的设计和功能,因此需要找到可以通过反编译的方式去查看一些想看的APP META-INF: 存放签名文件签名信息的目录,用于系统签名 ...

  8. Android APK 反编译浅入浅出:apktool 、dex2jar 、jd-gui

    摘要 APP 以其轻便.及时的特点日渐融入我们的生活,针对 APP 的舆情监控亦趋重要.如何将 APP 公开的数据纳入我们的舆情监控系统呢?本文从 APK 反编译的角度出发,为收集 APP 的公开数据 ...

  9. 反编译+混淆的攻守战

    准备一个APK 用于反编译和混淆的APK来自于<即拿即用-横向滚动+转场动画+GridView和RecyclerView动态添加>的Demo,地址:https://github.com/m ...

最新文章

  1. 将集合中的内容按时间排序
  2. 中科院院士指出“万物互联”只是开始,“万物控制”是物联网下一个挑战
  3. 如何删除SQL Server表中的重复行
  4. 智力题:64匹马8个跑道,至少需要多少轮才能挑选出最快的4匹马
  5. html鼠标滑轮换图片,JavaScript实现鼠标滚轮控制页面图片切换
  6. 零基础直接学Python入门IT合适吗?
  7. sql server (mssqlserver)无法启动,事件查看器提示SQL Server 无法生成 FRunCM 线程
  8. 高级排序之分割法(以某数为基准分割)
  9. 对勾函数_这16个Excel函数,帮你完成80%的数据统计工作
  10. (转,感谢原作者!)既然选择了Linux,有何必在乎这些——Linux wine国服LOL英雄联盟,完美运行!!...
  11. smartdrv.exe的使用及简单说明和相关程序下载
  12. 大数据在人力资源管理当中的应用
  13. Codeforces Gym 100015B Ball Painting 找规律
  14. 求和计算机教案,初中信息技术《Excel求和》教案
  15. 家政服务:保姆朋友圈鄙视链在上海
  16. android.view.ContextThemeWrapper cannot be cast to android.app.Activity
  17. 傲视天地 页游 一键端 自玩
  18. 千团大战再现社区团购 下一个“拼多多”会在这里诞生吗?
  19. ios 中生成随机数
  20. 《开源项目系列》 --- 简阅

热门文章

  1. Swift4之NSAttributedString的使用
  2. 【UIKit】表格自定义单元格(UITableViewCll)
  3. 数字建模matlab,Matlab基础及数学建模.ppt
  4. 5.13T1Send 题(send)
  5. JetBrains产品永久破解
  6. 非常经典的正则表达式
  7. 确定浏览器是否支持某些DOM模块
  8. Android 最火的快速开发框架XUtils
  9. SQL Server中count(*), count(col), count(1)的对比
  10. JavaScript弹出新窗口居中显示