一尘不染

从C#到Java

java

我已经使用C#,更广泛地使用.Net框架已有两年了。我经常听说C#和Java语言之间的相似之处,并且想了解有关第二种语言的更多信息。

  • 来自C#时,您对学习Java有任何具体建议吗?
  • C#程序员在启动Java时会发生任何常见错误吗?
  • 是否有任何文档显示了您可以保留的习惯和必须改变的习惯(仍然在C#到Java的可视性中,所以比C#与Java的比较要具体一些)

阅读 236

收藏
2020-12-03

共1个答案

一尘不染

好吧,尽管C#和Java表面上相似,但仍有一些细微的差别可能会咬你。通常,我认为相反的方向(从Java到C#)的问题较少。这主要是由于C#是一种更复杂的语言,因此您可能会发现常见Java模式的许多简化,但反之则可能会有些痛苦。

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

  • 不同…

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

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

* 类库:-)

虽然很明显,但这是我在学习语言时花费的大部分时间。在处理已知范例时,可以快速理清语法差异,但是在某些情况下,了解标准库/类库/框架会花费一些时间:-)

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

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

在您的代码中很常见1 :-)

* 类型。.NET具有普通的对象和值类型,它们都是对象,并且支持方法,属性&c。Java有的二分法 _原始_ 类型,例如`int`,`float`,`char`,& C。以及诸如此类的 _课程_`String`。没有多大关系,因为他们实现自动装箱,但有时它仍然恼人的包裹`int`在`Integer`。
* 多态:`virtual`默认情况下,所有Java方法都是默认方法,而c#方法则不是。
  • 较小的语法差异。
    • 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保留s。同样,当编译器抱怨?您泛型中的所有四个具有不同类型时,泛型中的通配符有时可能很难解析。(尽管公平地说:在这种情况下,无论如何我在运行时都需要类型信息,所以我又回到了Objects)。

一般建议:
找一个具有Java经验的朋友,让他浏览一下您的代码。当他直接问他这个问题时,虽然他可能无法告诉您所有您应该注意的事情,但他可以在代码中发现奇怪的事情,并通知您。这极大地帮助了我学习Java(尽管我先学习Java,然后再学习C#,所以可能有所不同)。


1是的,我知道许多捕获块看起来都不同,但这仍然是典型的捕获块,甚至没有那么罕见。 2
QuaereJaQueJaQuQuerydsl

3但是有lambdaj

2020-12-03