0

我知道 C# 4.0 中新的“动态”关键字有助于与动态 .NET 语言进行交互,并且可以通过使用它而不是反射来帮助削减代码。所以使用是针对非常特定的情况。

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

如果可能的话,是否推荐。为什么,或者为什么不分别?

我是否会在不切换到另一种语言的情况下获得动态语言的所有好处?

4

2 回答 2

5

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

首先,一些静态类型特性确实不能很好地与动态类型一起使用。例如:

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

看起来它应该总是有效的,因为IList暴露Count,对吧?试试这个:

ShowListCount(new int[10]);

砰。数组IList.Count通过显式接口实现来实现,因此当动态类型将对象“视为”为数组时,它看起来并没有看到Count属性。有各种各样的陷阱。

此外,如果您想在 C# 中实现动态行为(即被动态调用),则没有明确的语言支持。您可以从自己衍生DynamicObject或实现IDynamicMetaObjectProvider自己,但语言中的任何内容都无法帮助您。

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

基本上,C# 显然仍然是一种设计时考虑到静态类型的语言。能够在您想要的地方仔细使用动态类型是很好的,但是如果您想在代码库的某个区域广泛使用动态类型,我建议在 IronPython 中编写该位,然后从 C# 调用它。

于 2010-03-25T10:18:45.337 回答
1

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

于 2010-03-25T10:15:25.110 回答