montaque

小碗喝酒,小口吃肉

博客园 首页 新随笔 联系 订阅 管理
  119 Posts :: 1 Stories :: 685 Comments :: 17 Trackbacks

公告

今天的会议,Anders 的 session 座无虚席,Anders 回顾了一下C#的历史,以及展望了未来,然后着重提了几个特性。

C# 1.0, 大概98年11月份开始组件团队,马上就10年了。关键词:Managed Code,托管代码

C# 2.0, 提出了,Generics

C# 3.0, 主要是Linq

那么C# 4.0呢?

Anders 提到目前语言的几个方向,或者是以后的趋势

  • Declarative,所谓声明性语言,比如 Linq,他重点强调是关注做什么,而不是怎么做。或者类似SQL语言一眼
  • Dynamic,动态语言,这个比如当前流行的Ruby,Python,动态语言有动态语言的优势
  • CoCurreny,并发,或者说并行计算。目前进入多核时代,PDC上Intel,AMD 也都有自己的工具让你的C++程序来profile问题更好支持多核,以及编译器的支持。 

 

其中CoCurrent,CLR 4.0多了一个并行计算的类库,也有PLinQ,比如PLinq.For等

动态语言,以前有IronPython,这个版本会有完整的Runtime支持

比如 Dynamic Typed Object、 Optional and Named Parameter,这个特性就是可选参数以及命名的参数,VB.NET 很早就有了,过了10年,C#才有。Anders开玩笑说,这就叫Co—Evolution,可以说互相学习吧,为了VB.NET会跟C#特性尽可能的一致。

 

然后就是COM Interop,所谓的NoPIA的问题,以前做Office应用的时候,一个小的C#应用,比如访问Excel的Com 互操作,可能就要Reference一个1M多的Assembly。现在C#可以动态的把用到的接口和类型,嵌入到Assembly中,这个成为Assembly Embedding,而对于多个版本的问题,比如一个接口,不同版本,只要GUID一样,则可当作一个type,彼此可以互相CAST,只是运行的时候会约束方法参数一致,所谓Type Safe。

 

然后开始演示Dynamic ,包含了Expression Tree,Dynamic Dispatching,Call Site Caching。

下面则是不同的Binder,比如对JS,Python,Ruby的Binder

一个Demo是关于Silverlight的,我们知道在Silverlight的C#代码中,如果你要访问JS的话,大多会用

HtmlWindow.Invoke(“Foo”,Parameters)

那么现在改为

Dynamic win=HtmlWindow.AsDyanmic

可以直接Call

win.Foo(parameters) 运行的时候,Runtime会解析和派遣到对应的方法。

这时候Foo是JAVA Script写的一个方法,后来觉得还不过瘾。能不能用C#来写呢?

 

改为

 

private Foo()

{

Dynamic map=Window.New.Map();

map.Load(para)…

}

鼓掌。。。

然后演示了一下Python的集成

比如Define add(x,y):

     return x+y;

 

dynamic foo=pyahoruntime.load(“your.py”)

foo.add(x,y),直接调用

当然Python本来就是动态语言,你可以add(1,2),也可以add(Datetime.Now, timespan)

 

然后着重讲一下Dynamic,当然如果是Dynamic对于值类型的话,其实没有什么花样,在编译的时候就已经知道类型。对于动态的类型,runtime 在运行的时候派遣到对应的对象,方法。

Dynamic对象,有一个IDynamicObject接口,主要包含了一些GetMember,Invoke的方法。

也可以在C#中自己定义个一个动态对象。

比如

Foo:IDynamicObject

{

 

SetMember()

GetMember()

}

 

然后dynamic foo=new Foo();

foo.X=Value

foo.Y=Value

就会调用我们定义的SetMember方法。

然后我们可以写一个Generic的Helper方法。

比如

void DumpPrice(dynamic obj)

{

Console.Writeline(obj.Price + obj.Name)

}

不过是动态对象还是静态对象,只要有Price和Name两个member,都可以被DumpPrice方法调用

所谓的Dispatch可以到动态对象,也可以到静态对象

接下来演示了可选参数以及命名方法。

现在你可以这样定义方法了

SaveFIle(string filename,  int fileSize=1204,encoding coding=null)

你调用的时候可以

直接Saveas(”foo.txt”)

也可以SaveAS(“foo.txt”,fileSize:2034)

还可以打乱顺序,SaveAS(“foo.txt”, encoding:xyz, fileSize:2222)

又是鼓掌…

 

然后提了一下Co Contra Variance的问题。下面的代码,在3.0是不可能编译通过的。一个是Invariant问题一个是Contravariance问题

 

Code

 

IEnuamable<Object> 不等于IEnuamble<string>

多了一个IEnuamble<out T> 或者 <in T>

编译的时候就可以更安全检查

 

最后展望了更未来的版本

Anders说他很看好Meta Programming,可是目前的Compiler是个黑盒子,NativeC++写的。开发人员不能控制Comipler任何的行为。

以后Compiler 会变成一个Service,可以在你编译或者runtime的时候加入你自己的逻辑。

 

比如可以有一个Eval方法

CSharpEvaluator eval=new CSharpEvaluator();

eval.reference.add(“system”)

eval.eval(“for(int i=0;i<10;i++)  Console.WriteLine(i)”)

则会执行你输入的C#代码,有了这个你就可以快速做一个C#解释器,嘿嘿。不超过50行代码,Anders就Show了一个

这是这次的主要内容,供大家参考

posted on 2008-10-28 11:44 montaque 阅读(...) 评论(...) 编辑 收藏