从 C# 到 Java [已关闭]

2022-09-01 04:46:48

几年来,我一直在使用C#,更一般地说是.Net框架。我经常听说C#和Java语言之间的相似性,并希望更多地了解第二种语言。

  • 在从C#开始学习Java时,你有什么具体的建议吗?
  • C#程序员在启动Java时会犯什么常见错误?
  • 任何显示您可以保持的习惯和必须更改的习惯的文档(仍然在C#到Java光学中,因此比C#与Java比较更具体一些)?

答案 1

好吧,虽然C#和Java表面上是相似的,但有一些小的差异可能会咬你。一般来说,我认为相反的方向——从Java到C#——问题就不那么严重了。这主要是由于C#是一种更复杂的语言,所以你可能会发现许多来自常见Java模式的简化,但反过来可能会有点痛苦。

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

  • 不同。。。

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

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

    • 类库 :-)

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

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

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

      经常在你的代码1 :-)

    • 类型。虽然 .NET 具有普通对象和值类型,但它们都是对象和支持方法、属性和 c。Java 具有基元类型的二分法,例如 、 、 、 & c. 和(例如 )。这并不重要,因为他们实现了自动装箱,但有时包装在.intfloatcharStringintInteger
    • 多态性:默认情况下,所有 Java 方法都是默认的,而 c# 方法不是。virtual
  • 微小的语法差异。
    • foreach (a in b)for (a : b)
    • 不同的访问关键字。像和不存在的东西。但是,不合格的成员对同一包中的其他类是可见的(某种程度上,但又不完全是)。internalprotected internalinternal
    • 字符串比较不是在 Java 中完成的。您必须使用 .虽然在C#中字符串是值相等的,但在Java中始终是引用相等。==.equals()====
  • 不。。。

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

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


1 是的,我知道许多捕获块看起来不同,但是,这可能是典型的块,甚至不那么罕见
2QuaereJaQueJaQuQuerydsl
3 不过,有lambdaj。谢谢你指出这一点,埃斯科


答案 2

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


推荐