Чем C# отличается от C++ и Java
Все три языка — с похожим синтаксисом: фигурные скобки, ; в конце команд, if, for, while, классы. Отличаются они тем, как программа выполняется, как устроена работа с памятью и где их чаще применяют.
| C# | Java | C++ | |
|---|---|---|---|
| Автор | Microsoft, первая версия 2002 | Sun Microsystems (сейчас Oracle), 1995 | Бьёрн Страуструп, с 1983 |
| Во что компилируется | в промежуточный код для среды .NET | в байт-код для виртуальной машины Java (JVM) | сразу в машинный код |
| Память | освобождает сборщик мусора | освобождает сборщик мусора | освобождает программист (или «умные» указатели) |
| Указатели | только в особом режиме unsafe | нет | есть, используются постоянно |
| Наследование классов | один базовый класс + интерфейсы | один базовый класс + интерфейсы | несколько базовых классов |
| Вывод строки | Console.WriteLine("Hi"); | System.out.println("Hi"); | std::cout << "Hi\n"; |
Промежуточный код (в Java его называют байт-кодом) — команды не для процессора, а для среды выполнения: в машинный код их переводит .NET или JVM прямо во время работы. Сборщик мусора — часть среды выполнения, которая сама освобождает память, когда объект больше никому не нужен.
C# и Java
Языки очень похожи: оба со сборкой мусора, оба строго объектно-ориентированные, оба компилируются в промежуточный код. Перейти с одного на другой обычно несложно. Главные отличия C#:
- Свойства (
get,set) — в Java для того же пишут методыgetName()иsetName(). ==для строк сравнивает текст. В Java==сравнивает ссылки, и строки сравнивают черезequals.- Типы-значения
struct— свои маленькие типы, которые копируются целиком, как числа. - LINQ — запросы к спискам и массивам прямо в языке:
numbers.Where(n => n > 0).Sum(). asyncиawaitдля асинхронного кода,refиoutдля передачи переменных в методы.- Беззнаковые целые (
uint,ulong) и перегрузка операторов (+,==для своих классов). - Методы называют с большой буквы (
WriteLine), в Java — с маленькой (println). - В Java есть проверяемые исключения (
throwsв заголовке метода), в C# их нет.
C# и C++
C++ даёт полный контроль над памятью и железом: программа работает без среды выполнения и может быть очень быстрой. Цена — сложность: память выделяют и освобождают сами, ошибка с указателем может тихо испортить данные или обрушить программу. В C# за памятью следит сборщик мусора, выход за границы массива сразу даёт понятную ошибку IndexOutOfRangeException, а не случайный результат.
В C++ есть заголовочные файлы, шаблоны, множественное наследование и препроцессор (обработка строк с # до компиляции). В C# ничего этого нет или оно устроено проще: файлы .cs подключать друг к другу не нужно, обобщённые типы — типы с параметром, вроде List<T> для элементов любого типа T, — работают без шаблонов.
Где что применяют
- C# — игры на Unity, программы для Windows, сайты и серверы на ASP.NET Core, программы для Windows, Linux и macOS.
- Java — серверы крупных компаний, банковские системы, приложения для Android (вместе с Kotlin), Minecraft Java Edition.
- C++ — игровые движки (Unreal Engine), браузеры, части операционных систем, программы для работы с видео и звуком, олимпиадное программирование.
Что выбрать для учёбы
- Хочется делать игры на Unity или программы для Windows — C#.
- Олимпиады по программированию, движки, программы «поближе к железу» — C++ (тема C++).
- Android и серверы — Java (тема Java) или Kotlin.
Основы — переменные, условия, циклы, функции, классы — во всех трёх почти одинаковы. После одного языка второй осваивается заметно быстрее: учить заново приходится не основы, а особенности.