2010-03-25 36 views
0

我知道C#4.0中的新“动态”关键字有助于与动态.NET语言的交互,并且可以通过使用它而不是反射来帮助剪切代码。所以用法适用于非常特殊的情况。'动态'关键字和DLR是否将C#作为动态类型语言提升为第一类公民?

但是,我想知道的是,它是否会给C#带来的其他动态语言(如IronXXX语言)所带来的所有动态优势?换句话说,是否可以用动态语言风格在C#中编写整个应用程序?

如果有可能,是否会被推荐。为什么,或者为什么不分别?

我是否可以在不切换到其他语言的情况下获得动态语言的所有好处?

回答

5

我不会说C#是一流的动态语言,没有。

首先,一些静态打字功能在动态打字中的效果并不好。例如:

public void ShowListCount(IList foo) 
{ 
    dynamic d = foo; 
    Console.WriteLine(d.Count); 
} 

这看起来像它应该总是工作,因为IList暴露Count,对不对?试试这个:

ShowListCount(new int[10]); 

Bang。数组实现IList.Count具有明确的接口实现,所以当动态类型将对象看作数组时,它看起来不会看到Count属性。有这样的各种陷阱。另外,如果要在C#中实现动态行为(即动态调用),则不存在明确的语言支持。你可以从DynamicObject派生或实现IDynamicMetaObjectProvider你自己,但没有任何语言会帮助你。

我认为C#中的动态类型主要用于当您想与现有动态平台(如IronPython)或弱类型COM API进行互操作时使用的东西。有一些一些它可以在纯C#中有用,但它们相对较少。

基本上C#仍然是一个非常明显的设计静态类型的语言。有能力在你想要的地方仔细地使用动态输入是很好的,但是如果你想为你的代码库的一个区域广泛地使用动态输入,我会建议在IronPython中写入那一点,然后从C#中调用它。

+0

谢谢。非常明确和翔实的答案。 有关显式接口实现的有趣陷阱。 – 2010-03-25 10:47:31

1

尽管dynamic关键字肯定会使C#更接近动态世界,但它不会使其成为动态语言,因此它不会具有动态语言的优点,例如在运行时向现有类型添加方法, ...