从C#转到Java

时间:2010-01-21 14:15:22

标签: c# java

我已经使用C#,更普遍的是.Net框架已经有几年了。我经常听说C#和C之间的相似之处。 Java语言,想了解更多关于第二个的知识。

  • 从C#开始学习Java有什么具体的建议吗?
  • C#程序员在启动Java时会遇到的任何常见错误?
  • 任何文档都显示了您可以保留的习惯以及您必须更改的习惯(仍然在C#中使用Java视频,所以比C#与Java比较更具体一些)?

10 个答案:

答案 0 :(得分:66)

嗯,虽然C#和Java在表面上相似但是有一些小的差异可能会让你感到困惑。一般来说,我认为从Java到C#的相反方向 - 问题较少。这主要是因为C#是一种更复杂的语言,因此您可能会发现许多普通Java模式的简化,但反过来可能会有点痛苦。

需要注意的事项(部分清单,不保证详尽无遗):

  • 不同......

    • 命名约定。在Java中,只有类型名称以大写字母开头(即PascalCase),其他所有内容都使用camelCase。但是,并不是很难坚持。

      接口通常也不以I开头。另一方面,您必须使用不同的关键字实现它们。但是,在代码中间并没有真正帮助。

    • 班级图书馆: - )

      虽然显而易见,但这是我在学习语言时花费的最多时间。在处理已知范例时,语法差异很快得到解决,但在某些情况下,了解标准库/类库/框架需要一些时间: - )

    • 模式。嗯,不完全,它仍然是相同的东西。但是C#支持语言级别的一些模式,而你仍然需要在Java中自己实现它们。没有事件,但是观察者模式(在Swing中非常普遍 - 每当你看到一个监听器,你知道该怎么做: - ))
    • 异常处理。 Java具有所谓的已检查异常,这意味着必须捕获或向上声明异常。通常这意味着你有

      catch (SomeException ex) {
        ex.printStackTrace();
      }
      

      经常在您的代码中 1 : - )

    • 类型。虽然.NET具有普通对象和值类型,但它们都是对象和支持方法,属性和& c。 Java具有原始类型的二分法,例如intfloatchar和& c。和,例如String。自从他们实现了自动装箱以来没有多大关系,但有时在int中包裹Integer仍然很烦人。
    • 多态性:默认情况下,所有Java方法都是virtual,而c#方法则不是。{/ li>
  • 轻微的句法差异。
    • foreach (a in b)for (a : b)
    • 不同的访问关键字。 internalprotected internal之类的内容不存在。但是不合格的成员对于同一个包中的其他类是可见的(排序为internal,但后来又不完全)。
    • Java中的==未进行字符串比较。您必须使用.equals()。虽然在C#==上字符串是值相等,但在Java ==总是引用相等。
  • 不......

    • 属性。在Java中,这通常使用Foo getFoo() / void setFoo(Foo foo)模式来完成,当使用属性时C#会在您的背后静默生成,但您必须在Java中明确地执行此操作。通常,为了使语言本身更简单,Java中的许多东西都只是约定。不过,大多数时候你最好还是坚持下去: - )
    • 运算符重载。认为对正义程序员的危害是因为害怕被滥用而没有实施。不管怎么说都不要经常使用它们,即使在C#中也是如此,但有时它们很好然后你会遗漏一些东西。
    • 索引器。您始终必须通过myList.get(5)而不是类似数组的语法myList[5]来访问列表项。但是,这只是一个轻微的不便。
    • LINQ(虽然存在实现 2 ,但它没有很好地集成),或者lambda函数 3 (无论如何都没有委托,但是匿名类),扩展方法,或者部分课程(是的,在处理Swing时这是一个痛苦的课程,除非你非常纪律严明),以及更多的事情。
    • 多维数组。您可以使用锯齿状数组(数组数组),但不存在多维数据。
  • 泛型只是编译时,在运行时只剩下Object。当编译器抱怨你的泛型中的所有四个?具有不同类型时,泛型中的通配符有时很难解决。 (虽然公平地说:那是我在运行时需要类型信息的情况,所以我又回到了Object)。

一般建议:抓住一位有Java经验的朋友,让他浏览你的代码。虽然他可能无法告诉你当你直接问他这个问题时你应该照顾的一切,他可以在代码中发现奇怪的事情然后通知你。这对我学习Java有很大帮助(虽然我先学习Java然后学习C#,所以可能会有所不同)。


1 是的,我知道许多捕捉块看起来不同,但是,这可能是原型和not even that rare 2 QuaereJaQueJaQuQuerydsl
3 虽然有lambdaj。感谢您指出,Esko

答案 1 :(得分:11)

老实说,我认为许多试图学习Java的C#开发人员的最大障碍是学习新的IDE。 Visual Studio很棒,当你在C#中编写很长一段时间时,你会习惯它。当不得不转移到Eclipse或Netbeans时,你会突然感到迷茫。我该如何设置断点?最近的窗口在哪里?如何创建Windows应用程序?等等......我知道这听起来很疯狂,但我告诉你,人们非常依赖他们的IDE并且很难适应新的......

答案 2 :(得分:9)

语言本身非常相似,没有几个关键字,Java缺少C#程序员习惯的属性(属性,using,具体化(非类型擦除)泛型)。

这里的主要问题是框架的知识,其中有数千个用于Java。

答案 3 :(得分:5)

主要语言很好。了解库将是一件需要时间的事情。如果您正在进行Web应用程序,那么很多东西需要学习......与WCF和ASP.net等效的技术。 您没有说明您在哪个区域工作...桌面,服务器或Web服务器?

答案 4 :(得分:3)

C#和Java之间的最大区别:在Java中,所有方法都是virtual。因此,诸如NUnit等工具来自Java世界的原因。

答案 5 :(得分:2)

老实说,如果你是一名称职的C#程序员,我认为除了应用程序的打包和部署之外你还不需要了解它。

这是一个很好的链接http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp

答案 6 :(得分:2)

您需要学习的最重要的事情是如何在Java中使用Greenspun C#的功能样式功能。例如,您可以期望只使用一种方法创建大量接口,以解决Java缺少lambda函数和委托的问题。

答案 7 :(得分:1)

我诚实地推荐Java in a Nutshell。大多数Java / any_other_lang入门书籍都是针对完全新手的读者解释页面循环和章节递归的概念......你可以在两天内用本书开始编写Java程序。当然,您需要花费很长时间才能了解幕后发生的事情以及如何使用所有可用的框架。但是一旦掌握了语言本身,即使只使用谷歌资源也很容易相处。

答案 8 :(得分:1)

我从Java转换到C#并再次回到Java。我认为它们在语法上非常相似,我遇到的大部分麻烦都是学习.NET API并学习如何有效地使用它们。很多时候我使用'syntactic sugar',编写我的代码就好像是在Java中,然后将其翻译成C#。我花了很多时间在微软的网站上阅读和学习API,这是一个巨大的帮助。

答案 9 :(得分:1)

虽然这是另一种方式,但我发现以下链接对于比较Java和C#非常有用。

C# From a Java Developer's Perspective