我对此感到相当吝啬,所以请不要认为我会认真尝试这一点,因为我从苦涩的经验中了解静态类型检查系统的优势。
但是,至于一个概念,是否有可能以一种完全动态的方式基本上做C#,将静态类型检查器抛到一边并说“呃,你这么老式!”。
我最近有过IronPython和F#的丰富经验,但我觉得在家里使用的是基于C语言。
在动力学的道路上,C#可以走多远?我最近写了一个XML到ExpandoObject解析器,这很棒,感觉就像是javascript原型。
动态内容是如何优化的,它是否像NodeJs和CPython这样的一些真正的动态编程语言环境一样快?
答案 0 :(得分:14)
基本上可以以完全动态的方式做C#吗?
当然,为什么不呢?只需将所有内容输入“动态”。
我最近有过IronPython和F#
的丰富经验
我注意到F#不是动态类型语言;它是一个隐式类型的静态类型语言。仅仅因为你没有看到类型检查并不意味着它不存在。
动态内容的优化程度如何?
它针对速度进行了优化,但对内存使用和代码大小却很重要。我们在每个呼叫站点上构建一个缓存。第二次你打到一个呼叫站点时,确实应该非常快,但是你为此付出了内存成本。
它是否像NodeJs和CPython这样的一些真正的动态编程语言环境一样快?
尝试两种方法,测量它们,然后你就会知道。
答案 1 :(得分:5)
差不多。当然,在您与需要特定类型的其他代码(包括FCL)进行交互的任何时候,您都必须转换为期望的类型。但如果你真的看好这个,你可以创建一些方法,如:
public static object IntegerAdd(object x, object y)
{
return Convert.ToInt32(x) + Convert.ToInt32(y);
}
现在从代码的其余部分开始,有一些静态类型的事实永远不会让你感到不安!
我最近有过IronPython和F#的经验,
F#有点像真的大量使用var
和真的大量使用类型推断,而不是像使用{{1和后期绑定。一些C#代码(特别是大量使用linq)在没有单一显式声明的类型的情况下做了很多事情并不是很少见,但要通过和通过静态类型,这是一个更接近的比较。
在动力学的道路上,C#可以走多远?我最近写了一个XML到ExpandoObject解析器,这很棒,感觉就像是javascript原型。
如果你写这篇文章是因为你喜欢尝试这种方法,那就太棒了。
如果你写它是因为你需要它给的东西,那么也很棒。
如果你写它是因为你需要它给出的东西,和你喜欢尝试这种方法,那么血腥辉煌!你还能在工作中要求什么?
如果你使用它来回避C#对javascript优势的优势,那么我建议谨慎。从静态打字到“老式”,我们现在还有很长的路要走。这两种方法都有其优势。我不是说要外交,我真的认为他们这样做。 C#提供两者的混合意味着它可以从动态类型的一些优势中受益,尽管通常是强类型语言。这是一种富有表现力和高效率的组合,没有必要单腿拍摄,因为你更喜欢另一条腿。
答案 2 :(得分:1)
不,它不会起作用。
是的,它可能适用于您的代码,但您将处理许多以这种方式编写的系统库,这仍然使整个应用程序不是动态的。您基本上可以在静态的.NET框架中与NOTHING接口,而不会违反您自己的严格要求:
基本上可以以完全动态的方式执行C#,抛出静态类型 检查一边说“呃,你老太太老了!”。
这太难了。如果你想“让我的代码完全动态化”那么你可以做到这一点,但是你没有问过。
另外,作为旁注 - “动态”不是“古老的方式”。这只是一种方式。许多较老的语言都是强类型的。在汇编人员为了强大的语言后,他们立刻就开始了。然后过了一段时间才变得充满活力。但这意味着“古老的方式”这句话也是错误的。