我有一个朋友,他是一个认真的Linux开发人员,但现在他正在Windows上使用C#并且非常喜欢它。我被C#所吸引,因为像Java一样,我应该可以在一个系统上编译并在任何地方运行。
如果您使用C#在Windows上进行开发,则使用的是dot-Net。在Linux和MacOS上,您使用的是Mono。
其他人发布Mono非常好,不再是科学项目,并且大多数核心Microsoft功能都存在。但这并不能解决我的问题。我想知道:
由于
答案 0 :(得分:10)
我已经在Linux上使用Mono大约三年了,最近一直在OS X上使用它。一些Linux的东西非常广泛,但OS X的东西到目前为止只是一些简单的ASP.NET MVC2应用程序。
1)Mono的表现对我来说从来都不是问题。这并不是说性能不重要,只是Mono本身的性能从未成为问题。我所做的很多都是基于网络的,因此I / O和数据库内存的使用在Mono之前就已经让我感到震惊。
历史上,Mono最大的缺点是垃圾收集器(GC)。我想说Java在这方面有更好的调整。 Mono的最新版本在这方面取得了巨大进步,但在比较方面我没有任何硬数据。
我确信Mono有时会更快,而Java有时会更快,但我会说Java总体上更快。
2)你当然可以使用makefile进行Mono开发。当然Mono团队本身也是如此。此外,您当然可以使用Emacs,并且有一个C# mode for it。
我倾向于自己使用MonoDevelop和xbuild(monbu版本的msbuild),并且没有任何在Emacs中进行C#工作的经验。 MonoDevelop很棒,因为它在所有平台上完全相同。此外,虽然我很少再使用它,但项目格式与Visual Studio和SharpDevelop相同是很好的。
3)MonoDevelop具有相当不错的代码保理支持。在Windows,Linux和Mac上也是如此。您不需要使用Windows进行开发(尽管您当然可以)但我相信您会更喜欢使用像MonoDevelop这样的IDE。一旦你习惯了,就像智能感知这样的东西变得难以生存。但是,集成调试,能够深入到框架,数据库集成,单元测试,SCM集成以及其他所有好的工具支持都是一种可行的方式(至少对我而言)。
4)Mono本身并不关心版本控制。您的源文件只是文本,您可以使用任何东西来管理它们。
也就是说,MonoDevelop在IDE中内置了极好的Subversion支持。我已经广泛使用它,这也是我在Windows上移动MonoDevelop时遇到麻烦的原因之一。最新版本的MonoDevelop(2.6 beta)也包括Git支持。
您没有提到单元测试,但MonoDevelop还在IDE中内置了NUnit支持。我也在每个项目上使用它,它的工作非常出色。 MonoDevelop中的版本是2.4.8(如果内存服务),所以它不是很新,但效果很好。
简而言之,Mono在开源工具方面的效果非常好。它一直对我很好。
Autoconf当然是由Mono项目本身使用的,但作为Mono开发人员,我从未见过需要它。我努力只在我的项目中使用托管代码。因此,我在目标平台上所需要的只是Mono(或.NET)。不必担心所有这些问题是Mono或Java等托管环境的主要优点之一。运行时本身(CLR)确保我的应用程序具有正常运行所需的一切。
我知道MonoDevelop将为C / C ++项目(非Mono)构建autoconf / autorun文件,但我自己并没有做太多。
至于先前的评论,Mono JIT显然已调整到目标平台。这就是平台特定的性能调整发生的地方。
正如评论一样,我发现Mono最好被视为一个开发环境,而不是微软的兼容层。 Mono团队以许多有趣的方式扩展了.NET。您为Mono开发的任何内容都将在.NET上运行,但有一些.NET功能不适用于Mono。例如,Mono不支持Windows Presentation Foundation(WPF)。您必须使用Windows窗体或GTK#进行跨平台GUI工作。您还可以在Mac上使用Cocoa#或MonoMac,在iPhone上使用MonoTouch或在Android上使用MonoDroid。你可以使用Moonlight而不是Silverlight,虽然我没有玩过很多。
自从你询问Java以来还有一件事。我发现Java世界有几次库在.NET世界中找不到相应的库。在这些情况下,使用IKVM.NET将此功能集成到我的Mono应用程序中,我获得了惊人的运气。 IKVM.NET也适用于.NET,但Mono和IKVM.NET非常舒适,甚至可以共享一些代码。
所以你去,至少给你一个真正的答案。