deep in c# syntactic sugar

18
Deep in C# Syntactic Sugar Zhiming Jiang MSN GMD CSL & Integration

Upload: lanvige-jiang

Post on 21-May-2015

920 views

Category:

Technology


6 download

DESCRIPTION

深入C#语法糖看语言发展方向

TRANSCRIPT

Page 1: Deep in c# syntactic sugar

Deep in C# Syntactic Sugar

Zhiming JiangMSN GMD CSL & Integration

Page 2: Deep in c# syntactic sugar

TOPIC

• C# 的发展过程• 面向对象如何被支持• Var 关键词• 认识泛型• Yiled 的使用• Lambda & LINQ

Page 3: Deep in c# syntactic sugar
Page 4: Deep in c# syntactic sugar

计算机不懂对象编程语言中是怎么实现面向对象的

Page 5: Deep in c# syntactic sugar

面向过程

• 冯诺依曼体系• 顺序化执行• 数据和结构紧紧耦合• 难以进行扩展

• 仍能做出好的软件

面向对象

• 计算机面向人类思维的一次转变• 面对更复杂的事物时提供一种解

决方案• 抽象机制和现实接近

• 易于扩展

O O

Page 6: Deep in c# syntactic sugar

语言层面实现的本质

• 对象字段编译完后和过程语言中的 struct 一样• 编译器将所有的对象方法转为普通方法• Private Public 在编译后都不再存在• 方法参数列表中加入指向自身的一个参数 (this)

– 如 Python 中 self( 不是类本身,而是实例本身 )

* 以上以 C 和 C++ 为参考进行对比, C# 则引入 Metadata 机制

Page 7: Deep in c# syntactic sugar

C# 执行流程

C#

• dgasfgas

IL• CLR

机器码• JIT

Page 8: Deep in c# syntactic sugar

可爱的 VAR由编译器在编译时推断出类型

Page 9: Deep in c# syntactic sugar

VAR 的作用

• 它有利于更好地为本地变量命名。• 它有利于设计更好的 API 。• 它促使对变量进行初始化。• 它消除了代码的混乱。• 它不需要 using 指示符。

• 过度使用 var 会使得源代码晦涩难懂。• 在使用变量之前,通常需要将变量初始化为 null ,而 var 关键字对此却不支持

* 本段摘自: http://www.infoq.com/news/2008/05/CSharp-var

Page 10: Deep in c# syntactic sugar

Sourcestatic void Main(string[] args){ var strab = “Hello”; string strdc = “World”;}

I L .entrypoint // Code size 14 (0xe) .maxstack 1 .locals init ([0] string strab, [1] string strdc) IL_0000: nop IL_0001: ldstr "Hello" IL_0006: stloc.0 IL_0007: ldstr "World" IL_000c: stloc.1 IL_000d: ret

• 由编译器在编译时推断出类型• ldstr: load String 将字符串入栈• .Net Reflector Tool

Page 11: Deep in c# syntactic sugar

认识泛型泛型是怎么被实现的 意义:

复用装箱拆箱所带来的性能问题约束

Page 12: Deep in c# syntactic sugar

泛型本质• 依然是占位符• JIT 会为值类型创建各自的本地代码实现• 引用类型实际都共享一个方法的代码 ( 避免方法爆炸 )

* 1. 示例代码摘至: CLR内部有太多太多IL看不到的东西,包括您平时必须了解的那些* 2. 思考: 为什么将泛型实现交给 JIT ,而非由 CLR 直接处理

private static void GenericMethod<T>(){ Console.WriteLine(typeof(T));}

static void Main(string[] args){ GenericMethod<string>(); GenericMethod<int>(); GenericMethod<object>(); GenericMethod<DateTime>(); GenericMethod<Program>(); GenericMethod<double>();

Console.ReadLine();}

00a70071 mov ebp,esp00a70073 mov ecx,3A30C4h (MD: ....GenericMethod[[System.String00a70078 call dword ptr ds:[3A3098h] (....GenericMethod[[System.__Canon,00a7007e call dword ptr ds:[3A3108h] (....GenericMethod[[System.Int3200a70084 mov ecx,3A3134h (MD: ....GenericMethod[[System.Object00a70089 call dword ptr ds:[3A3098h] (....GenericMethod[[System.__Canon00a7008f call dword ptr ds:[3A3178h] (....GenericMethod[[System.DateTime00a70095 mov ecx,3A31A4h (MD: ....GenericMethod[[TestConsole.Program00a7009a call dword ptr ds:[3A3098h] (....GenericMethod[[System.__Canon00a700a0 call dword ptr ds:[3A31E8h] (....GenericMethod[[System.Double

// 引用类型实际都共享一个 GenericMethod<System.__Canon> 方法的代码

Page 13: Deep in c# syntactic sugar

认识 YIELD• 简化迭代• 延迟计算

Page 14: Deep in c# syntactic sugar

Yiled 本质

• CLR 后台生成一个标准的迭代器全代码• 调用时执行,延迟技术,对查询条件进行优化

• [Code Demo]

Page 15: Deep in c# syntactic sugar

LAMBDA & LINQ

Page 16: Deep in c# syntactic sugar

Lambda

//1.0delegate int Dele(string s);static int Find(string s){     return s.IndexOf("abc");}Dele t = new Dele(Find);

//2.0 匿名方法fruits.Find(delegate(string s) { return s.IndexOf("abc"; });

//3.0 Lambdafruits.Find(s => s. s.IndexOf("abc"));

* 课后练习:自己动手分析 Lambda 背后的 IL 代码

Page 17: Deep in c# syntactic sugar

C# 语言的方向 • 功能化• 语义化• 多核并行• 动态

Page 18: Deep in c# syntactic sugar

IT IS OVER , THANKS