作为C#开发人员,您会学习Java为Android开发还是使用MonoDroid?[关闭]


46

我认为自己非常精通C#。目前,这是我选择的语言,基本上,这就是我所有专业经验的基础。

不过,我对MonoDroid项目的存在感到困惑。我一直认为C#和Java 非常接近。就像,如果您知道一个,就可以很快地学习另一个。因此,当我考虑开发自己的第一个Android应用程序时,我以为自己会熟悉Java并足以入手,然后就可以自己学习了。

这难道不比使用MonoDroid更有意义,因为MonoDroid的功能可能不如Java Android SDK丰富,并且仍然需要学习自己的API(尽管是.NET API)?我只是觉得学习一门新语言(以及当时非常流行的一种语言)并获得一些经验(最好是无论如何都已经非常接近它)会更好,而不是坚持使用已有的技术却没有获得更多有价值的技能

也许我严重误解了平均潜在的MonoDroid用户。也许对Java和.NET经验丰富的人更喜欢.NET。或者,也许(实际上有可能)我只是没有考虑其他因素。我只是想知道,为什么您会使用MonoDroid而不是仅使用Java为Android开发?


11
谷歌短语“是新的COBOL”,看看谷歌想出了什么语言...
John Reynolds

1
@JohnReynolds Ironic则认为,目前增长最快的是使用“新COBOL”的移动设备和Android。无论采用哪种方式对其进行切片,即使您选择MonoDroid,即使您是针对Android开发的,也仍然依赖于“新的COBOL”。
詹森·S

1
“新的COBOL”是指语言,而不是VM(是JVM还是Dalvik)。因此,MonoDroid不依赖“新的COBOL”,Scala和Clojure或任何其他JVM语言也不依赖。
约翰·雷诺兹

仍然有大量的旧COBOL。
Alan B

具有讽刺意味的是,当今运行的大多数代码是COBOL;最具有讽刺意味的是,C#是Java的克隆(但由于它也克隆了大多数错误的东西,所以是一个很差的事实)。
m3th0dman

Answers:


55

任何有能力的C#程序员都应该能够快速掌握足够的Java来编写Android程序,但这不是重点。这是代码重用的问题。

想想从现在开始的六个月后,当您的Android程序流行并且您的用户要求iPhone和Windows Phone 7的版本。如果您使用过MonoDroid,则可以通过MonoTouch(适用于iOS的Mono)和Windows Phone SDK。现在他们需要一个基于Web的版本,因此您可以在ASP.Net项目中包含相同的类库。桌面版?没问题,同一个类库可在Windows或Linux和OS X的Mono下与.Net一起使用。

除了C或C ++,我想不出任何其他语言来让您在所有这些目标上重用相同的代码。

编辑以解决注释中的某些问题: .Net和Mono 将不允许您编写完整的程序并在各处使用同一程序。它们将使您共享一些代码,并且像所有跨平台编程一样,共享代码的数量取决于您正在编写的程序类型以及将UI和硬件代码与应用程序逻辑分开的程度。

但是,如果您使用Java编写Android应用,那么其中有多少可在iOS或Windows Phone上重用?这就是我要提出的观点。我拥有现有的C#库,它们在Android版Mono上运行的时间比重新实现它们所需的时间要少得多,即使我已经知道Java。多亏了Mono,我在两个不同的移动平台上的网站,桌面程序和移动应用程序之间共享了一些未经修改的代码。

我并不是要暗示甚至间接暗示Mono是每种移动开发情况的理想工具。这是一个折衷,但是我坚信在某些情况下,Mono是更好的选择。

请查看(并赞扬!)Jason S的答案以换个角度。


12
而且我认为Java就是这样的口号:“编写一次到处运行”!
卢西亚诺

3
@Luciano -相同的参数可以,如果OP曾表示,他知道Java作为想知道是否学习C#应用。重要的一点是代码重用,而不是语言。
克里斯·

14
出于同样的原因,在室内选择了Mono。我们需要在多个平台和所有编码器中使用新的c#构建客户端。从理论上讲,这是一个好主意。但是实际上,它变成了一场噩梦。我们发现在许多地方无法在本机.NET平台上运行的代码在MacOS平台上无法工作,因此我们不得不做一个例外。然后相同的代码在LInux中不起作用。总体而言,单声道似乎太不稳定。最后,我们不得不放弃这个想法,回到为目标操作系统编写本机代码的过程。

4
尽管如此,唯一可重复使用的代码是业务逻辑,而不是 UI代码或与电话硬件交互的代码。看到我有一个MonoTouch或WindowsPhone 7应用程序,是否可以仅使用Mono for Android并以Android为目标来重建它?在MonoDroid常见问题上。
杰森S

2
@JasonS,我已经更新了我的答案,以解决您的评论。作为记录,我对Xamarin和Mono的唯一参与是满意的用户。
凯文

18

这是一种补充性的答案,因为到目前为止,似乎在答案中已被忽略的一件事涉及实际上是跨平台的东西。根据Xamarin本身,这基本上是您的业务逻辑,而不是您的UI或任何硬件控件(例如GPS,音频,地址簿等)。这些将必须针对每个平台专门编写。看到他们的常见问题解答条目我有一个MonoTouch或WindowsPhone 7应用程序,是否可以使用Mono for Android和目标Android对其进行重建?

使用Mono,您可以使用C#编写UI和电话控制代码,但它不能移植到任何平台。即使您可以用C#编写,也必须编写每个平台的UI和电话控件。无论哪种方式,您仍然必须学习Android上的UI控件的细节以及Android如何处理电话资源。

使用Mono,您将必须学习调用Android API的Mono API。您还必须等待Mono实现新的Android功能,并希望它们实现所有Android功能。即使C#比Java更强大,您也无法做得比直接使用Android SDK(使用Java)多。

如果您直接从C#转到Android,由于C#在语法上与Java非常相似,那么大多数C#开发人员在Android方面的学习都将学习Android API。

一些注意事项...

从C#到Android

需要学习

  • Android API
  • Java API:字符串,日历和事件处理等。

不需要学习

  • Java语法:C#的语法非常相似。

其他注意事项

  • 您将无法跨平台重用代码。
  • 您和Android SDK之间不会有任何依赖关系。您将获得新的Android功能,因为它们已经发布。
  • 您可能会比Mono拥有更多的Android代码支持和示例。

C#转Mono

需要学习

  • Android:您仍然需要学习Android的UI和硬件控制功能。
  • Mono API:您必须学习如何调用Mono的API才能使用Android的UI和硬件进行操作。

不需要学习

  • Java API和语法:可以用C#开发

其他注意事项

  • 重用代码:您可以重用没有任何UI或硬件控制代码的C#代码,因此是纯“业务逻辑”。尽管理想,但如此干净的分离并不总是那么容易。您将不得不评估您的代码中有多少没有任何UI或硬件控件。
  • 依赖关系:您依赖于实现Android API的Mono。Android API版本可能有些滞后,或者某些Android功能可能永远无法实现。
  • 您可能没有多少文档和示例可供选择。

您忘了提及P / Invoke。一个样品。
Amir Karimi

-1:你是什么意思Learn the Mono API?您实际上需要知道多少才能开发Android应用程序?您是否实际尝试过MonoDroid还是在猜测?
Jim G.

@吉姆 通过Learn the Mono API,我的意思是,除了它没有的部分外,您还需要学习Mono复制的Android API。您需要知道多少?取决于应用程序,取决于人员-这实际上并不是OP的要旨。我使用过MonoDroid吗?不,我有C#,Java和Objective C的经验,所以不需要。我确实考虑过Mono的可移植性。在我回答的时候,没有人提到便携性的限制。我不介意别人不同意我的观点,但这本身并不会使我的回答变得很糟糕。
Jason S

13

我认为这很大程度上与可用资源有关。

C#和Java 的语法可能相似,但是它们提供了截然不同的东西。例如,使用标准Java库处理日期是一场噩梦,而在C#中,这是一件令人愉快的事情。


2
有趣的是-因此,吸引人的地方更多是对.NET库的访问。您是否偶然知道.NET是否提供了许多与Android相关的便捷功能,而使用Java Android API很难实现?
丹涛

19
+
Oded

4
我发现C#和Java之间的相似之处在它们之间切换时不是优势。我可以眨眼之间就可以在C#和Python,Ruby或Lua之间切换,但是最后一次尝试进行Java编码时,我最终磨了牙,转动了轮子。
亚当·克罗斯兰

1
@丹道:上诉是没有更多有关访问的标准.NET。这与重复使用有关。重用的好处应该显而易见。至于访问.Net,我是这样看的。我曾经使用过XDocument 1000次和1次。如果我需要编写一个移动应用程序以集成服务中的XML数据,那么我会以思想的速度编写它。如果我正在学习 Java,那么在编码和阅读文档之间来回弹跳的时间可能很容易长4到8倍(或者是10或12倍,谁知道)。如果用于商业用途,在学习语言的同时进行项目是不负责任的。
2011年

9

看来这是学习一种新语言的绝好机会,我不认为您应该放弃。

从C#到Java都是轻而易举的,因为它们基于相同的概念。Java就像C#的一个子集,因此您必须学习一些东西(例如属性和程序集)并习惯一些新的约定,但是大多数情况下,它应该很简单。


10
并找出泛型在每个函数中的工作方式之间的区别,并想知道为什么属性不存在,以及事件和...
Oded

5
小差异。好像他不必学习Haskell。
Martin Wickman'1

1
+1如果知道几种不同的语言与您已经知道的语言是一种相似的语言,那么掌握一种现实世界的项目是一种摆脱困境的好方法。
glenatron 2011年

最好确保付费的人可以为学习经历付费。
2011年

1
@qes-在大多数情况下,学习多余的东西不足以证明成本合理,但是大多数情况下,在其本机环境中开发复杂的应用程序会更加顺利,这可能会使学习变得更多长期降低成本。
Morgan Herlocker 2011年

3

快速历史课程-MonoDroid源自MonoTouch。当时很有道理。不幸的是,Novell被出售,整个Mono团队被解雇。好消息是,Miguel de Icaza获得了资金,并已开始组建新机构来重建MonoTouch / MonoDroid。因此,在它们真正发布之前,您一直处于困境。

2011年7月更新:Miguel的服装已重新获得整个Mono *堆栈的版权。得到它的时候。


很好听(2011年7月更新)。我之前曾尝试过Mono,但发现它有点令人失望。我再试试看!
Brian Knoblauch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.