我该如何将Java代码转换为C#代码?

6

我正在将一个Java库移植到C#。我使用的是Visual Studio 2008,所以我没有已停用的Microsoft Java语言转换助手程序(JLCA)。

我的方法是创建一个新解决方案,与Java库具有类似的项目结构,然后将Java代码复制到C#文件中,并逐行将其转换为有效的C#代码。考虑到我发现Java易于阅读,两种语言之间的细微差别让我感到惊讶。

有些东西很容易移植(命名空间、继承等),但有些东西却出乎意料地不同,比如嵌套类中私有成员的可见性、覆盖虚拟方法和内置类型的行为。我并不完全理解这些东西,我相信还有很多其他的差异我还没有看到。

我在这个项目上还有很长的路要走。在进行此转换期间,我可以应用哪些经验法则来正确处理语言差异呢?


请点击此处查看有关自动将Java转换为C#的建议:https://dev59.com/5HRB5IYBdhLWcg3w-8Lo - Anderson Green
5个回答

3

你正在以唯一明智的方式进行操作...最大的帮助将来自Dare Obasanjo编写的这个文档,其中列出了这两种语言之间的差异:

http://www.25hoursaday.com/CsharpVsJava.html

顺便提一下,将所有的getter和setter方法改成属性...没有必要让C#库函数与Java库函数完全相同,除非你要实现完美的接口兼容性。


谢谢提供链接 - 这是我正在做的很好的参考资料。 - Lee
1
将所有的getter和setter方法转换为属性-最好再考虑一下。更正确的做法是按照MSDN指南中所述,改为属性。我刚刚不得不将一堆“属性”还原为1)没有get的set方法2)非确定性3)返回构建数组的方法...这是别人写的。盲目地将其转换为属性而不考虑属性应该像字段一样运作并不是一个好策略。如果有疑问,保持它是一个方法。 - NightOwl888

3
一些值得注意的其他选项:
  • J#是微软在.NET上实现的Java语言。您可以访问Java库(最高版本为1.4*)。 *实际上,java.io/lang的版本为Java 1.1.4,java.util的版本为1.2,需要记住J#的生命周期是2015-2017年的J# 2.0 redist。

  • Mono的IKVM也可以在CLR上运行Java,并访问其他.NET程序。

  • Microsoft Visual Studio 2005带有一个“Java语言转换助手”,可以自动将Java程序转换为C#程序。


请记住,Java 1.4现在已经有10年历史了。因此,只有在特殊情况下才应该使用J#。它的目的是为现有的J++(还记得吗?)客户提供迁移到.NET的路径,而不是作为一般的Java-on-.NET解决方案。 - Cheeso

1
另一个快速而简单的想法:您可以使用IKVM将Java jar转换为.NET程序集,然后使用Reflector - 结合FileDisassembler插件 - 将其反汇编为Visual C#项目。
(顺便说一下,我实际上还没有使用过IKVM - 有人可以证明这个过程可行吗?)

2
IKVM库可以使用,但如果你尝试在Reflector中反汇编它,你会发现一些由IKVM生成的MSIL无法被反汇编为C#。我猜想C#的结构是所有可能的IL结构的一个子集,或者至少Reflector只处理了一个典型/预期的子集。 - redcalx

0

如果您有少量的代码,那么逐行转换可能是最有效的。

如果您有大量的代码,我建议考虑以下几点:

  1. 寻找一个可以为您完成转换的产品。
  2. 编写一个脚本(Ruby或Perl可能是一个不错的选择)来为您完成转换 - 至少是一些单调乏味的工作!它可以是关键字差异和文件重命名的简单搜索/替换。这样可以让您有更多的时间/精力集中在更难的事情上。

-1

我不确定逐行转换代码是否真的是最好的方法,特别是当障碍变得不可逾越时。当然,Java代码为您提供了指导和基本结构,但我认为最重要的是库能够像在Java中一样提供相同的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接