“.NET”不是一种语言。也许是Python vs. C#或Python/Django vs C#/ASP.NET(或选择您想要的任何“webwork”;对于Python和“.NET”,有许多不同的解决方案,选择Django或MVC2可能会严重限制更好的可行选项)。作为Python vs. “.NET”的反驳:有
IronPython(Python“在.NET中”)。
我会考虑:开发人员对语言的熟悉程度,如果他们在Python和“.NET”中相等,则会考虑开发周转时间,并选择最小化此时间的语言/“webwork”(同样,它不需要是以前的约束)。
虽然单元/集成测试对于任何[可观]项目都是必须的,但我发现
静态类型语言(C#/F#)可以
大大减少与类型相关的“愚蠢错误”的数量。
打开比赛场地:-)
评论编辑:
那么你只是在比较语言。
在这种情况下,C# 是一种非常无聊的命令式静态类型语言,具有单继承/接口类基础面向对象(但比 Java 多了一些不错的技巧,而 Java 则是彻头彻尾的石器时代)。这是与 Python 相同的基本面向对象类型,除了静态/动态部分之外,两种语言都是强类型的(机制不同,但在语言范围内结果相当相似)。实际上,Python 有 MI,但似乎在 Python 中不太被接受,因为使用“lambda”关键字以及由于 Python 是动态类型的,所以没有编译时支持来确定接口/类型合同(但是有一些模块试图提供此功能)。
如果你能学会/了解Python,那么你也能学会/了解C#。 这并不是一个范式转变。有些关键词在这里,大括号在那里,需要指定你想表达的类型,在不同的基础库中......不同的环境(你需要花一些时间才能进入REPL,但在VS中可以实现)。开发者喜欢/学习/使用它的方式是另一回事。虽然我以前把C#称为命令式编程语言,但很高兴看到添加了一些“函数式”特性,如LINQ/IEnumerable扩展和闭包-无需委托,即使基本的C#语法非常过程化——再次说明,与Python非常相似(for-表达式,嵌套函数,语句/表达式划分)。
虽然新的“dynamic”确实模糊了界限(在以前的C#版本中,人们可能不得不退回到反射的所有相同位置,但这并不是真的,但重点是通常是“错误的方法”,除非在少数情况下它恰好是“最佳/唯一的方法”),但“var”不是。也就是说,“var”变量的类型在编译时已知,并且与动态类型无关;这都是类型推断。一些语言,如F#/SML和Haskell,具有更强大的类型推断功能,消除了“所有那些丑陋的类型声明”的需要(尽管明确注释允许的类型或类型集可以使意图更清晰),同时保留静态类型。
个人而言,
除了其他方面,我会选择使用静态类型语言。我并不是说C#(绝对不是Java!),但是
静态类型语言可以将类型错误推到顶部,并要求明确的前期合同(这对我来说是一个巨大的胜利)。虽然你可能会错过一些有趣的动态技巧,但在目标语言中执行相同操作的方法几乎总是更好的方式--你只需要用螺丝刀拧螺丝,用锤子敲钉子。例如,不要指望将依赖于local()或global()的Python代码原封不动地带入C#。
“缺点”是,大多数静态类型语言(如C#)需要显式编译(但这并不糟糕,因为它可以生成漂亮的程序集),而像“REPL”这样的工具则不被视为一等公民(在F#/VS2010中它是一等公民)。此外,如果你有一个对Python/C#至关重要的库(而且在另一种语言中不可用),那么这可能是选择一种语言而不是另一种语言的决定性因素。