从C#切换到Java,我应该关注哪些“陷阱”?


9

对于新项目,我可能不得不切换到Java。我对Java的了解很少,因为我主要研究和使用C#,而且我担心这两种语言/平台之间的差异可能会给我带来很多问题。

我应该关注哪些陷阱/陷阱?


我认为该博客涵盖了您正在寻找的很多内容。ericsink.com/entries/java_eclipse_2.html
Hari Menon 2010年

3
C#和Java之间有许多区别,每一个都是对此问题的潜在“答案”。但是,我怀疑这对您或其他人是否很有用。提出更具体,真实的问题将产生更多有用的答案。或者,尝试寻求从C#切换到Java的参考或指南,而不是(实际上是无尽的)差异。

换句话说,尝试询问有关特定问题的“为什么”或“如何”问题。例如,询问参考文献,指南或书籍就像询问“如何从C#转换为Java”,或者询问您不理解的特定代码是“为什么这样做X而不是Y”的问题。

考虑制作此社区Wiki
finnw 2010年

Answers:


36

以下是来自C#的一些重要Java陷阱:

也可以看看

相关问题

关于上面列出的一些主题:

在一般的Java陷阱中:


8
现在你可以在字符串中的Java SE 7切换
马尔科姆·

泛型 +1 只能通过引用类型进行非确定性和参数化,今天对我有很大帮助
cctan 2012年

您还应该添加java没有结构。

13

一个明显的陷阱是比较具有C#样式的字符串string1 == string2(Java仅比较引用)而不是Java样式string1.equals(string2)

另一个是Java private中C#中的默认访问修饰符package

同样,ToString()方法不会被Java中的当前区域性自动本地化。


这是没有操作员重载的事实的扩展。
Graphain

3
错误。Package-private是Java的默认访问修饰符。
奥利弗·韦勒

@Helper方法:抱歉。我的意思是C#默认使用private,但不使用Java。现在已编辑。

12

让我着迷的Java子字符串 args是beginIndex,endIndex,而C#Subtring args是startIndex,length。这足以使它变得烦人,并且有很大的可能性使索引无论采用哪种切换方式都超出范围。


3
+1更令人困惑的事实是,它是beginIndex INCLUSIVE和endIndex EXCLUSIVE ...,并且在JDK中发现了一些使用startIndex,length方法的API ...
Oliver Weiler,2010年

10
  • 你没有LINQ
  • 您没有任何好看的UI(没有WPF)
  • 没有属性
  • 你会跳舞埃及人
  • 您可以获得没有示例和良好文档的API


2
从来没有发现Java API不好(实际上更容易导航),但是例子肯定更少。埃及人怎么了?
Graphain

3
我对此表示赞同……即使是讽刺的低语。
mpen


8
这些是真正的陷阱吗?我知道陷阱可能是导致错误的原因。这些就是您必须忍受的事情,因为您无法采取其他任何方式。

2
@cloudanger:同意你的观点。陷阱应该是错误地“起作用”的东西,而不是什至不起作用的东西。
Vimvq1987

10
  • Java枚举功能更强大/更复杂,它们实际上是实型类,而不是命名整数。
  • Java中的内部类功能更强大(它们的行为不同)
  • 没有委托,只有功能对象
  • 构造函数链接thing在两种语言中都有完全不同的语法,每次在C#中这样做时,我都会失败
  • Java已扩展了子类并实现了接口,这非常不错。相反,C#遵循一种命名约定,该约定表示接口名称以大写I开头。我不喜欢那个约定,因为我永远无法确定别人是否失败。
  • Java自动装箱可以在a **中咬你
  • Java类型擦除确实使事情变得更加复杂

2
你在开玩笑吧?-1,但是。你不能当真

3
您至少应该弄清楚您不喜欢哪一点,否则我必须假设您只是在拖钓。
atamanroman 2010年

2
现在,您不仅在开玩笑,还只是个无知:linux在后端领域很重要,javadoc比这些愚蠢的ms帮助文件更加干净,如果您从网络共享中查看它们,它们将无法工作。沙堡几乎没有文件记录,没有正确的GUI完全无法使用。大多数人都会同意Java框架中有一个非常不错的集合,而joshua bloch在那里做得很好。而“傻瓜”书只是您不理解的书。Eclipse是一个很棒的IDE,VS如果没有外部插件就无法站立。顺便说一句:我喜欢C#,而Java中却缺少linq。走出您的ms-office-world。
atamanroman 2010年

1
这些项目中只有一个是
陷阱

1
我也为-1,您也不知道什么是一个好主意(因此也不了解与编程相关的任何知识)。编辑:Pffft Java更成熟,Java甚至没有真正的泛型。

6

最大的陷阱是假设 Java语言和库的行为与C#中类似的事物相同。做教程,阅读javadocs,不要假设...

另一个元陷阱是假设您可以在Java中像在C#中一样/可以/可以同样 /容易地完成某事。这不是真的。Java是一种更古老的语言,并且犯了错误。

最后一个元陷阱是认为抱怨SO上Java中缺少/不同的东西将使您得到普遍的同情/支持性响应!


3

注意默认访问修饰符之间的差异。还要注意,Java中的所有非静态方法都是虚拟的(除非您将它们标记为最终方法)。

尽管有些过时了,但我发现这是一个很好的参考。

Dare Obasanjo撰写的C#和Java比较


3
Also note that all non-static methods in Java are virtual.我多么希望C#是这样太
Graphain

3
我很高兴事实并非如此,因为它破坏了OOP的原因。默认情况下,每种方法都是虚拟的,因此基本上可以替换整个类,而这通常是您不希望的。同样,将方法从非最终形式更改为最终形式可能会破坏派生代码,而另一种方法则不会。
Femaref 2011年


0

我认为您的问题是主观的。此处无法全部解释。我建议你阅读Java的谜题,通过Joshua Bloch and Neal Gafter。您可以学到更多,并避免陷入陷阱。


并不是所有的陷阱,但是C#程序员可能会在Java中造成陷阱:)
Vimvq1987

1
@ Vimvq1987-没有理由假设您在切换到Java之后不会遇到“ Java Puzzlers”陷阱。
斯蒂芬·C

-1

在Java语言中,原始类型(例如int,char)的目标等效项不是“值类型”(例如,Integer是引用类型)。在C#中,System.Int32是一个结构。

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.