锁定老帖子 主题:喜欢或者厌恶MS,都要看看 C# 4.0
精华帖 (1) :: 良好帖 (14) :: 新手帖 (0) :: 隐藏帖 (14)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-31
就当java们还在为要不要在java中添加闭包、扩展方法而吵吵闹闹的时候,C# 4.0又开始添加新的技术特点,这次它的老师不再是老大笨重的java,而是来自动态语言python与ruby。和java社区开源,思想封闭的情况不一样,MS fans们以极大的热情和开放的心态,投入这场静态语言与动态语言的融合中去。 除了进一步完善了DLR这个为动态语言而设计的runtime(这一完美设计基本就宣判了 ruby.net的死刑,奠定了ironruby的胜局),C# 4.0也为此打开了门户,在C# 4.0中,添加dynamic这一关键字,这个关键字告诉编译器:“别担心我要做什么,运行时的时候就明了”。请看例子 using System; using Microsoft.CSharp.RuntimeBinder; using System.Scripting.Actions; using System.Linq.Expressions; namespace ConsoleApplication1 { public class Program { static void Main(string[] args) { DoSomethingDynamic(7); DoSomethingDynamic(new Actor()); DoSomethingDynamic(new DynamicThing()); Console.ReadLine(); } static void DoSomethingDynamic(dynamic thing) { try { thing.Act(); } catch (RuntimeBinderException) { Console.WriteLine("thing does not implement Act"); } } } public class Actor { public void Act() { Console.WriteLine("Actor.Act() was called"); } } public class DynamicThing : IDynamicObject { public MetaObject GetMetaObject(System.Linq.Expressions.Expression parameter) { return new CustomMetaObject(parameter); } } public class CustomMetaObject : MetaObject { public CustomMetaObject(Expression parameter) : base(parameter, Restrictions.Empty){ } public override MetaObject Call(CallAction action, MetaObject[] args) { Console.WriteLine("A method named: '{0}' was called", action.Name); return this; } } } 例子中的方法DoSomethingDynamic(dynamic thing),拥有一个带有dynamic关键字的变量thing。我们调用thing的方法Act(); 编译器无法检查thing是不是有Act方法直到运行的时候,为保险起见,我们用个try-catch块来捕捉异常。当然另一方面,鸭子类型(duck type)使得编程时无法使用智能提示,你可以在变量后面随手涂鸦,thing.Foo(), thing + 56, thing.X = "hello", var y = thing[12],这堆东西都能被编译。 接下来,我们在Main入口里反复调用了DoSomethingDynamic,传送了不同类型的参数: 首先是整数类型7。Int32没有Act方法,所以RuntimeBinderException被抛出。 其实是一个正常的类Actor带有一个Act方法,因此一切正常。 最后是继承了IDynamicObject的类DynamicThing ,IDynamicObject只有一个GetMetaObject方法需要被实现. GetMetaObject返回一个MetaObject,而你要做的实现一个如何处理方法调用的CustomMetaObject.我们的 CustomMetaObject重载了Call方法,并简单打印出方法的名字. C# 现在主要还是静态类型语言,而Anders确定静态类型对于大型可伸缩系统是更好的范例。同时他也觉察到了动态特性的魅力,并为C#添加了诸如VB和其他动态语言的特性。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-10-31
太长了,看了开头就读不下去了
2个疑问 1 开放:在linux下跑c#的举个手 2 ironruby的胜局:用这个做过应用的举个手 有时间在和你慢慢扯 |
|
返回顶楼 | |
发表时间:2008-10-31
ironruby没真正用,因为同时投资python和ruby没有意义
不过ironpython已经去年就已经开始用在程序的脚本引擎和报表定制上了 java程序员也要open一些,现在已经不是用一种语言的时代了 |
|
返回顶楼 | |
发表时间:2008-10-31
下一站,火星 写道 太长了,看了开头就读不下去了
2个疑问 1 开放:在linux下跑c#的举个手 2 ironruby的胜局:用这个做过应用的举个手 有时间在和你慢慢扯 你国小毕业了吗? 1.我说的开放是指对动态语言和新的语言特点的接纳度方法,谁跟你扯这个? 你干嘛不指望java的关键字除了接受英文外还可以接受阿拉伯文? 2.我说的是ironruny和ruby.net之争,一个用的是DLR另一个非,明白?了解? |
|
返回顶楼 | |
发表时间:2008-10-31
除非微软官方支持mono,否则无视
|
|
返回顶楼 | |
发表时间:2008-10-31
我也不喜欢windows和.net,不过工作的话,给钱多一样干……我无所谓语言……
|
|
返回顶楼 | |
发表时间:2008-10-31
ray_linn 写道
下一站,火星 写道
太长了,看了开头就读不下去了
2个疑问 1 开放:在linux下跑c#的举个手 2 ironruby的胜局:用这个做过应用的举个手 有时间在和你慢慢扯 你国小毕业了吗? 1.我说的开放是指对动态语言和新的语言特点的接纳度方法,谁跟你扯这个? 你干嘛不指望java的关键字除了接受英文外还可以接受阿拉伯文? 2.我说的是ironruny和ruby.net之争,一个用的是DLR另一个非,明白?了解?
你压根就没明白ironruny。ironruny为什么要用DLR?不用行吗?ruby根本就不需要脱裤子放屁,这是解释型的语言天生的优势!
我宁愿去学JRuby,微软这个东西本来就是拿来对付JRuby的,和Ruby一毛钱的关系也没有
|
|
返回顶楼 | |
发表时间:2008-10-31
JAVA的问题是冗长的历史和巨头之间的争吵。.net目前还没有这个问题,所以它仍然可以靠语法糖来沾走程序员的眼光。
WinForm什么时候能够变成真正的OSWinForm. .net就离成功不远了。 |
|
返回顶楼 | |
发表时间:2008-10-31
qubic 写道 除非微软官方支持mono,否则无视
why?windows server 2008+powershell你用过么? |
|
返回顶楼 | |
发表时间:2008-10-31
下一站,火星 写道
ray_linn 写道
下一站,火星 写道
太长了,看了开头就读不下去了
2个疑问 1 开放:在linux下跑c#的举个手 2 ironruby的胜局:用这个做过应用的举个手 有时间在和你慢慢扯 你国小毕业了吗? 1.我说的开放是指对动态语言和新的语言特点的接纳度方法,谁跟你扯这个? 你干嘛不指望java的关键字除了接受英文外还可以接受阿拉伯文? 2.我说的是ironruny和ruby.net之争,一个用的是DLR另一个非,明白?了解?
你压根就没明白ironruny。ironruny为什么要用DLR?不用行吗?ruby根本就不需要脱裤子放屁,这是解释型的语言天生的优势!
我宁愿去学JRuby,微软这个东西本来就是拿来对付JRuby的,和Ruby一毛钱的关系也没有
一个最简单的Ruby.net CLR摆脱不了Reflection.Emit,性能就会被打折扣,DLR胜在这一点。
你脑子里的筋也不知道怎么长的,突然又跳到ruby什么天生优势上来?前后有逻辑关联么?第三句话更是无厘头,难道是火星人的思维方式? |
|
返回顶楼 | |