Как мне преобразовать код Java в код C#?

Я портирую библиотеку Java на C#. Я использую Visual Studio 2008, поэтому у меня нет прекращенной программы Microsoft Java Language Conversion Assistant (JLCA).

Мой подход состоит в том, чтобы создать новое решение с аналогичной структурой проекта для библиотеки Java, а затем скопировать код Java в файл C# и преобразовать его в действительный C# построчно. Учитывая, что я нахожу Java легко читаемым, тонкие различия между двумя языками меня удивили.

Некоторые вещи легко переносить (пространства имен, наследование и т. д.), Но некоторые вещи неожиданно изменились, например, видимость закрытых членов во вложенных классах, переопределение виртуальных методов и поведение встроенных типов. Я не совсем понимаю эти вещи и уверен, что есть много других отличий, которых я еще не видел.

Мне предстоит долгий путь над этим проектом. Какие практические правила я могу применить во время этого преобразования, чтобы правильно управлять языковыми различиями?

См. Здесь предложения по автоматическому преобразованию Java-to-C#: stackoverflow.com/questions/443010/…

Anderson Green 06.11.2012 22:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
1
9 295
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Вы делаете это единственно разумным способом ... самым большим подспорьем будет этот документ от Dare Obasanjo, в котором перечислены различия между двумя языками:

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

Кстати, измените все методы получения и установки на свойства ... Нет необходимости иметь функцию библиотеки C# так же, как библиотеку java, если вы не стремитесь к идеальной совместимости интерфейса.

Спасибо за ссылку - это отличный справочный материал для того, чем я занимаюсь.

Lee 05.10.2008 17:36

"преобразовать все методы получения и установки в свойства" - лучше подумайте еще раз об этом. Правильнее было бы сказать, измените на свойства как указано в рекомендациях MSDN. Мне просто пришлось вернуть кучу «свойств» обратно к методам, которые: 1) установлены без получения 2) недетерминированные 3) возвращенные построенные массивы ... которые сделал кто-то другой. Слепое преобразование в свойства без учета того, что свойства должны действовать как поля, - не лучшая стратегия. Если сомневаетесь, оставьте это методом.

NightOwl888 04.02.2017 07:10

Я не уверен, действительно ли это лучший способ преобразовать код построчно, особенно если препятствия становятся огромными. Конечно, код Java дает вам руководство и базовую структуру, но я думаю, что в конце концов, наиболее важным является то, что библиотека действительно обеспечивает ту же функциональность, что и в Java.

На днях я слышал кое-что о версии Java .net. Если бы такой монстр был доступен, вы бы просто смогли скомпилировать исходный код java в промежуточные библиотеки .net?

Он действительно существует? Если да, то где вы об этом узнали?

Anderson Green 06.11.2012 22:03

Извините, сейчас не могу найти. Я считаю, что это было добавление к какому-то продукту (не на свободном языке), но мне следовало найти ссылки. Во всяком случае, это было 4 года назад - если бы это был продукт, то теперь его почти наверняка нет! :(

Bill K 11.11.2012 03:41

Если у вас небольшой объем кода, то, вероятно, наиболее эффективным будет построчное преобразование.

Если у вас большой объем кода, я бы подумал:

  1. Ищете продукт, который поможет вам в разговоре.
  2. Написание сценария (Ruby или Perl может быть хорошим кандидатом) для преобразования за вас - по крайней мере, монотонный материал! Это может быть простой поиск / замена различий в ключевых словах и переименование файлов. Дает вам больше времени / пальцев, чтобы сосредоточиться на более сложных вещах.

Стоит отметить еще пару вариантов:

  • J # - язык Java от Microsoft. реализация на .NET. Ты можешь доступ к библиотекам Java (до версии 1.4 *, так или иначе). * собственно Java 1.1.4 для java.io/lang, и 1.2 для java.util + имейте в виду, что конец J # жизнь ~ 2015-2017 для J # 2.0 redist

  • IKVM Моно также запускает Java на CLR с доступом к другим .NET программы.

  • Microsoft Visual Studio 2005 приходит с "преобразованием языка Java помощник ", конвертирующий Java программы в программы на C# автоматически для вас.

Имейте в виду, что Java 1.4 сейчас исполнилось 10 лет? По этой причине J # следует использовать только в исключительных случаях. Он был задуман как путь для существующих клиентов J ++ (помните?) К .NET. Не как общее решение Java-on-.NET.

Cheeso 01.04.2009 00:14

Еще одна пошлая идея: вы можете использовать ИКВМ для преобразования jar-файла Java в сборку .NET, а затем использовать Отражатель - в сочетании с надстройкой FileDisassembler - для дизассемблирования его в проект Visual C#.

(Кстати, я на самом деле не использовал IKVM - кто-нибудь может поручиться, что этот процесс сработает?)

Можно использовать библиотеку IKVM, но если вы попытаетесь разобрать ее в Reflector, вы обнаружите, что некоторые из MSIL, сгенерированных IKVM, не могут быть разобраны в C#. Я предполагаю, что конструкции C# - это подмножество всех конструкций, которые возможны с IL, или, по крайней мере, Reflector обрабатывает только подмножество, которое является типичным / ожидаемым.

redcalx 09.07.2009 17:54

Другие вопросы по теме