是否可以仅使用C#的动态部分创建整个应用程序?

时间:2012-01-27 14:36:58

标签: c#

我对此感到相当吝啬,所以请不要认为我会认真尝试这一点,因为我从苦涩的经验中了解静态类型检查系统的优势。

但是,至于一个概念,是否有可能以一种完全动态的方式基本上做C#,将静态类型检查器抛到一边并说“呃,你这么老式!”。

我最近有过IronPython和F#的丰富经验,但我觉得在家里使用的是基于C语言。

在动力学的道路上,C#可以走多远?我最近写了一个XML到ExpandoObject解析器,这很棒,感觉就像是javascript原型。

动态内容是如何优化的,它是否像NodeJs和CPython这样的一些真正的动态编程语言环境一样快?

3 个答案:

答案 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#,抛出静态类型   检查一边说“呃,你老太太老了!”。

这太难了。如果你想“让我的代码完全动态化”那么你可以做到这一点,但是你没有问过。

另外,作为旁注 - “动态”不是“古老的方式”。这只是一种方式。许多较老的语言都是强类型的。在汇编人员为了强大的语言后,他们立刻就开始了。然后过了一段时间才变得充满活力。但这意味着“古老的方式”这句话也是错误的。