我知道 C# 4.0 中新的“动态”关键字有助于与动态 .NET 语言进行交互,并且可以通过使用它而不是反射来帮助削减代码。所以使用是针对非常特定的情况。
但是,我想知道的是,它是否会给 C# 提供在其他动态语言(例如 IronXXX 语言)中可以获得的所有动态优势?换句话说,是否有可能以动态语言风格用 C# 编写整个应用程序?
如果可能的话,是否推荐。为什么,或者为什么不分别?
我是否会在不切换到另一种语言的情况下获得动态语言的所有好处?
我知道 C# 4.0 中新的“动态”关键字有助于与动态 .NET 语言进行交互,并且可以通过使用它而不是反射来帮助削减代码。所以使用是针对非常特定的情况。
但是,我想知道的是,它是否会给 C# 提供在其他动态语言(例如 IronXXX 语言)中可以获得的所有动态优势?换句话说,是否有可能以动态语言风格用 C# 编写整个应用程序?
如果可能的话,是否推荐。为什么,或者为什么不分别?
我是否会在不切换到另一种语言的情况下获得动态语言的所有好处?
我不会说 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# 调用它。
虽然dynamic
关键字肯定会使 C# 更接近动态世界,但它不会使其成为动态语言,因此它不会具有动态语言的好处,例如在运行时向现有类型添加方法,...