c# - 从 C# 到 Java

标签 c# java

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




8年前关闭。




几年来,我一直在使用 C# 和更一般的 .Net 框架。我经常听说 C# 和 Java 语言之间的相似性,并且想了解更多关于第二个语言的信息。

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

    好吧,虽然 C# 和 Java 从表面上看很相似,但仍有许多细微的差异可能会让您大吃一惊。一般来说,我认为相反的方向——从 Java 到 C#——问题较少。这主要是因为 C# 是一种更复杂的语言,因此您可能会从常见的 Java 模式中找到许多简化,但反过来可能会有点痛苦。

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

  • 不同的 ...
  • 命名约定。在 Java 中,只有类型名称以大写字母开头(即 PascalCase),其他所有类型都使用驼峰命名。不过,不是很难坚持。

    另外接口(interface)一般不以I开头.另一方面,您必须使用不同的关键字来实现它们。但是,在代码中间并没有真正帮助。
  • 类库:-)

    虽然显而易见,但这是我在学习语言时花费最多的时间。在处理已知范式时,语法差异会很快得到解决,但在某些情况下,了解标准库/类库/框架需要一些时间:-)
  • 图案。嗯,不完全是,它仍然是相同的东西。但是C#在语言层面支持了一些模式,而你仍然需要自己在Java中实现它们。没有事件,但是观察者模式(在 Swing 中非常普遍——每当你看到一个监听器,你就知道该怎么做:-))
  • 异常处理。 Java 有所谓的检查异常,这意味着异常必须被捕获或向上声明。通常这意味着你有
    catch (SomeException ex) {
      ex.printStackTrace();
    }
    

    经常在你的代码1 :-)
  • 类型。虽然 .NET 具有普通对象和值类型,但它们都是对象并支持方法、属性等。 Java 有原始类型的二分法,例如 int , float , char , &C。和类,例如 String .因为他们实现了自动装箱,所以没什么关系,但有时包装 int 仍然很烦人。在 Integer .
  • 多态性:所有 Java 方法都是 virtual默认情况下,而 c# 方法不是。
  • 细微的语法差异。
  • foreach (a in b)for (a : b)
  • 不同的访问关键字。诸如 internal 之类的东西和 protected 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(无论如何都没有委托(delegate),而是匿名类)、扩展方法或部分类(是的,在处理 Swing 时这是一个痛苦的过程,除非您非常熟悉纪律严明),以及其他一些事情。
  • 多维数组。您可以使用锯齿状数组(数组数组),但不存在真正的多维性。
  • 泛型仅在编译时可用,仅在运行时可用 Object s 仍然存在。当编译器提示所有四个 ? 时,泛型中的通配符有时也很难解决。在具有不同类型的泛型中。 (公平地说:在这种情况下,无论如何我都会在运行时需要类型信息,所以我又回到了 Object s)。

  • 一般建议:找一个有 Java 经验的 friend ,让他看看你的代码。当你直接问他这个问题时,他可能无法告诉你你应该注意的一切,但他可以很好地发现代码中的奇怪东西并通知你。这对我学习Java有很大的帮助(虽然我是先学Java然后C#,所以可能会有所不同)。

    1 是的,我知道许多 catch 块看起来不同,但是,这可能是典型的块和 not even that rare .
    2 Quaere , JaQue , JaQu , Querydsl
    3 有 lambdaj , 尽管。感谢您指出这一点,Esko .

    关于c# - 从 C# 到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2109807/

    相关文章:

    c# 读取一个文本文件。如何避免重读

    java - 从字符串中获取原始数字类型的类

    java - 声明中的Android AsyncTask错误

    java - 无法将项目添加到组合框

    java - 具有泛型参数的方法之间的类型不匹配

    c# - `AsyncCallback` 和 `@object` 关于 .Net 中的委托(delegate)的目的是什么

    c# - UITextField.ShouldReturn : how to use async method?

    c# - 在 WPF 日历上标记特定日期

    c# - RenderTransform 占用太多 CPU

    java - Mac 上找不到 MySQL,使用 mysql-connector-java-5.1.13-bin.jar 的 eclipse 项目出现问题