论坛首页 编程语言技术论坛

喜欢或者厌恶MS,都要看看 C# 4.0

浏览 9174 次
精华帖 (1) :: 良好帖 (14) :: 新手帖 (0) :: 隐藏帖 (14)
作者 正文
   发表时间:2008-10-31  
无论Java Fans对MS多么咬牙切齿深恶痛决,你都不能不承认C#的成功。从当初被指摘为"抄袭java"的小弟,一跃成为引导主流OO语言特性的老大。甚至,可以说你看看未来版本的C#,就可以大概了解接下来几个版本的java会添加什么特性。

就当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和其他动态语言的特性。
   发表时间:2008-10-31  
太长了,看了开头就读不下去了
2个疑问
1 开放:在linux下跑c#的举个手

2 ironruby的胜局:用这个做过应用的举个手

有时间在和你慢慢扯
0 请登录后投票
   发表时间:2008-10-31  
ironruby没真正用,因为同时投资python和ruby没有意义

不过ironpython已经去年就已经开始用在程序的脚本引擎和报表定制上了

java程序员也要open一些,现在已经不是用一种语言的时代了

1 请登录后投票
   发表时间:2008-10-31  
下一站,火星 写道
太长了,看了开头就读不下去了
2个疑问
1 开放:在linux下跑c#的举个手

2 ironruby的胜局:用这个做过应用的举个手

有时间在和你慢慢扯



你国小毕业了吗?

1.我说的开放是指对动态语言和新的语言特点的接纳度方法,谁跟你扯这个? 你干嘛不指望java的关键字除了接受英文外还可以接受阿拉伯文?

2.我说的是ironruny和ruby.net之争,一个用的是DLR另一个非,明白?了解?
0 请登录后投票
   发表时间:2008-10-31  
除非微软官方支持mono,否则无视
0 请登录后投票
   发表时间:2008-10-31  
我也不喜欢windows和.net,不过工作的话,给钱多一样干……我无所谓语言……
0 请登录后投票
   发表时间: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一毛钱的关系也没有

 

0 请登录后投票
   发表时间:2008-10-31  
JAVA的问题是冗长的历史和巨头之间的争吵。.net目前还没有这个问题,所以它仍然可以靠语法糖来沾走程序员的眼光。
WinForm什么时候能够变成真正的OSWinForm. .net就离成功不远了。
0 请登录后投票
   发表时间:2008-10-31  
qubic 写道
除非微软官方支持mono,否则无视


why?windows server 2008+powershell你用过么?
0 请登录后投票
   发表时间: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什么天生优势上来?前后有逻辑关联么?第三句话更是无厘头,难道是火星人的思维方式?

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics