Поделиться через


Дорожная карта для разработчиков Java, изучающих C#

Если вы начинаете новую работу или присоединяетесь к команде, использующую C#, эта статья помогает быстро повысить эффективность работы. В нем описаны знакомые возможности Java и новые возможности C#.

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

  1. Аналогичный синтаксис: Java и C# находятся в семействе языков C. Это сходство означает, что вы уже можете читать и понимать C#. Существуют некоторые различия, но большая часть синтаксиса совпадает с Java и C. Фигурные скобки и точка с запятой знакомы. Операторы управления, такие как if, else, switch, одинаковы. Цикловые операторы for, whileи do...while одинаковы. Одни и те же ключевые слова для class и interface присутствуют в обоих языках. Модификаторы доступа от public до private совпадают. Даже многие встроенные типы используют одни и те же ключевые слова: int, stringи double.
  2. Объектно-ориентированной парадигмы: Как Java, так и C# являются объектно-ориентированными языками. Понятия полиморфизма, абстракции и инкапсуляции применяются на обоих языках. Оба добавили новые конструкции, но основные функции остаются актуальными.
  3. Строго типизированные: Java и C# являются строго типизированными языками. Тип данных переменных объявляется явно или неявно. Компилятор обеспечивает безопасность типов. Компилятор перехватывает ошибки, связанные с типами в вашем коде, ещё до его выполнения.
  4. Кроссплатформенные: Java и C# являются кроссплатформенными. Вы можете запускать средства разработки на любимой платформе. Приложение может работать на нескольких платформах. Платформа разработки не обязана совпадать с вашей целевой платформой.
  5. Обработка исключений: как Java, так и C# вызывают исключения для указания ошибок. Оба блока используются try - catch - finally для обработки исключений. Классы Exception имеют схожие имена и иерархии наследования. Одно из различий заключается в том, что C# не имеет концепции проверенных исключений. Любой метод может (в теории) вызвать любое исключение.
  6. Стандартные библиотеки: среда выполнения .NET и стандартная библиотека Java (JSL) поддерживают распространенные задачи. Оба имеют обширные экосистемы для других пакетов с открытым исходным кодом. В C# диспетчер пакетов — NuGet. Это аналогично Maven.
  7. Сборка мусора. Оба языка используют автоматическое управление памятью с помощью сборки мусора. Среда выполнения освобождает память от объектов, на которые нет ссылок. Одно из различий заключается в том, что C# позволяет создавать типы значений в виде struct типов.

Синтаксис на первый взгляд

В следующих примерах показаны несколько распространенных шаблонов параллельно. Эти сравнения не являются исчерпывающими, но они позволяют быстро почувствовать различия синтаксиса.

Объявление переменных и вывод типов:

// Java
var name = "Hello";
final int count = 5;
// C#
var name = "Hello";
const int count = 5;

Интерполяция строк:

// Java
var message = "Hello, " + name + "! Count: " + count;
// C#
var message = $"Hello, {name}! Count: {count}";

Дополнительные сведения: интерполяция строк

Лямбда-выражения:

// Java
list.stream().filter(x -> x > 5).collect(Collectors.toList());
// C#
var result = list.Where(x => x > 5).ToList();

Дополнительные сведения: обзор LINQ

Обработка NULL:

// Java
String value = optional.orElse("default");
// C#
string value = input ?? "default";

Дополнительные сведения: ссылочные типы, допускающие значение NULL

Что знакомо

Вы можете эффективно работать в C# практически сразу из-за сходства. По мере изучения вы узнаете о функциях и идиомах в C#, которые недоступны в Java.

  1. Сопоставление шаблонов: сопоставление шаблонов включает краткие условные операторы и выражения на основе формы сложных структур данных. is оператор проверяет, соответствует ли переменная некоторому шаблону. Выражение на основе шаблонов предоставляет широкий синтаксис для проверки переменной и принятия решений на основе её характеристик.
  2. Интерполяция строк и необработанные строковые литералы: интерполяция строк позволяет вставлять вычислянные выражения в строку, а не использовать позиционные идентификаторы. Необработанные строковые литералы позволяют свести к минимуму escape-последовательности в тексте.
  3. Типы, допускающие значение NULL и не допускающие значение NULL: C# поддерживает типы значений, допускающие значение NULL, и ссылочные типы, допускающие значение NULL, путем добавления ? суффикса к типу. Для типов, допускающих значение NULL, компилятор предупреждает вас, если вы не проверяете на null прежде чем разыменовать выражение. Для типов, не допускающих значение NULL, компилятор предупреждает вас, если вы можете назначить null значение этой переменной. Ссылочные типы, не допускающие значения NULL, сводят к минимуму ошибки программирования, которые вызывают ошибку System.NullReferenceException.
  4. Расширения. В C#можно создавать элементы, расширяющие класс или интерфейс. Расширения обеспечивают новое поведение для типа из библиотеки или всех типов, реализующих заданный интерфейс.
  5. LINQ: интегрированный язык запросов (LINQ) предоставляет общий синтаксис для запроса и преобразования данных независимо от его хранилища.
  6. Локальные функции: в C#можно вложить функции в методы или другие локальные функции. Локальные функции предоставляют еще один слой инкапсуляции.

Подсказка

Дополнительные сведения о системе типов C#, включая struct vs. class, записи и интерфейсы, см. в обзоре системы типов в разделе "Основы".

В C# существуют другие функции, которые не находятся в Java. Функции, такие как async и await, моделируют асинхронные операции в последовательном синтаксисе. Оператор using автоматически освобождает ресурсы, не относящиеся к памяти.

Существуют также некоторые аналогичные функции между C# и Java, которые имеют тонкие, но важные различия:

  1. Свойства и индексаторы: свойства и индексаторы (обработка класса, например массива или словаря), поддерживают язык. В Java существуют соглашения об именовании для методов, начинающихся с get и set.
  2. Записи: В C# записи могут быть либо class (ссылочные), либо struct (значимые) типы. Записи C# могут быть неизменяемыми, но не обязательно быть неизменяемыми.
  3. Кортежи имеют различный синтаксис в C# и Java.
  4. Атрибуты похожи на аннотации Java.

Наконец, существуют функции языка Java, недоступные в C#:

  1. Проверенные исключения: в C#любой метод теоретически может вызвать любое исключение.
  2. Проверенная ковариация массива: в C#массивы не являются безопасными ковариантными. Если вам нужны ковариантные структуры, следует использовать универсальные классы и интерфейсы коллекции.

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

Дальнейшие шаги