今天的会议,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问题
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
delegate T Func1<out T>();
delegate void Action1<in T>(T a);
static void Main(string[] args)
{
Func1<Cat> cat = () => new Cat();
Func1<Animal> animal = cat;
Action1<Animal> act1 = (ani) => { Console.WriteLine(ani); };
Action1<Cat> cat1 = act1;
Console.WriteLine(animal());
cat1(new Cat());
}
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了一个
这是这次的主要内容,供大家参考