Примерно два месяца назад, подождав немного Delphi 10.4 Community Edition, вновь решил попробовать свои силы в изучении C#. Надо сказать, что попытки изучить этот язык программирования у меня были давным давно, ещё в 2011 году, но тогда особой необходимости переходить в новый язык программирования для меня не было (в отличие от нынешней ситуации), поэтому все мои познания в C# тогда ограничились небольшим приложением а-ля «Hello world». Сегодня дело обстоит иначе и в этой статье я попробую не предвзято рассказать о том, что мне нравиться в C# и чего мне не хватает в этом языке программирования по сравнению с Delphi.
Из Delphi в C# за три дня
Надо сказать, что, благодаря нововведениям в Delphi, начиная с версии Delphi 2009, процесс изучения C#, лично для меня, был достаточно легким. Да пришлось немного привыкнуть к новому синтаксису языка и изучить немного вопросы, связанные с новыми для меня типами данных — делегатами и кортежами. Но, опять же, обладая хотя бы минимальными знаниями в Delphi по работе с анонимными методами, думаю, что серьезных проблем с делегатами не возникнет ни у кого (хотя отличия и есть).
В общем, первое, более менее рабочее приложение на C# по работе с большим количеством (более 20000) XML-файлов было написано за три дня. При этом, попутно добавил в приложение работы с TPL (Task Parallel library, аналог в Delphi — PPL).
При этом, я отдаю себе отчёт в том, что мои познания в C#, по сравнению с Delphi, крайне небольшие и это приложение ещё потребует своей доработки и улучшений в любом случае. Но факт остается фактом — переход с Delphi на C# проходит довольно легко и не принужденно, если этого захотеть.
За что мне понравились C# и Visual Studio
Начал я изучение с самой, на данный момент, последней версии C# 8.0. И вот, что я мог бы выделить в качестве положительных моментов в C#.
Лаконичность языка
Думаю, что те, кто знает хотя бы в общих чертах и C# и Delphi, согласятся со мной, что по большей части, для написания одной и той же конструкции в C# требуется меньше времени, чем в Delphi. Забегая немного вперед, скажу, что это далеко не аксиома и в C# есть свои «приколы» где Delphi, на мой взгляд, выглядит на голову выше C#. Но, тем не менее, лично у меня, код в C# намного короче, чем аналогичный в Delphi.
Документация
Да, Delphi в плане документации и информации в Сети тоже далеко не на последнем месте, по сравнению с другими языками программирования, но, что касается C#, то на данный момент я крайне редко обращаюсь к сторонним ресурсам по языку и, в основном изучаю все возможности C# исключительно по справочным материалам на сайте Microsoft. Документация самого разного уровня — от информации для новичков (типа небольших интерактивных курсов) и, заканчивая подробнейшим описанием классов .NET позволяет погрузиться в язык C# более полно.
Наличие бесплатной среды
К сожалению, Idera/Embarcadero не может себе позволить раздавать студию бесплатно и без каких-либо ограничений (хотя и выпускают в свет Community Edition). Microdoft же позволяет пользоваться Visual Studio бесплатно. И пока я не вижу никаких серьезных ограничений, препятствующих нормальной работе, в бесплатной версии Visual Studio по сравнению с платной.
В Delphi есть замечательный инструмент — Code Insight. В Visual Studio, наряду с аналогичным инструментом, также имеются быстрые действия, которые позволяют улучшить код, а, заодно и, со временем, приучают Вас писать код более кратко. Например, вот такой условный оператор:
int j; if (i == 0) { j = 1; } else { j = 0; }
Visual Studio с помощью быстрого действия поможет сократить до так называемой тернарной операции:
int j = i == 0 ? 1 : 0;
В начале кажется, что код стал менее читабельным, но, со временем, на столько привыкаешь к такой записи условий, что уже и не замечаешь, как сам, без подсказок Visual Studio, начинаешь использовать сокращенные проверки условий.
Аналогичным образом в Visual Studio начинаешь узнавать и другие языковые конструкции, вплоть до самых последних нововведений и обучение новому языку становится ещё более легким.
Что мне НЕ нравится в C#
Как я сказал выше, некоторые моменты в Delphi выглядят, лично для меня, на порядок лучше и красивее, чем в C#. И вот, что на данный момент мне не нравится в C#.
Работа с множествами
Возможно, что я сейчас ошибусь, так как изучаю C# всего пару месяцев, но, по-моему, в C# нет такой операции, как проверка на вхождение элемента в множество.
Например, в Delphi мы можем провести вот такую проверку:
if (2 in [0..5]) then res:='2 входит в множество'
В C# такой возможности нет. Да, в C# есть типы данных наподобие HashSet<int>
, можно использовать и List<int>
(аналог Delphi — TList<int>
). И, используя методы типа Contains()
можно проверить есть ли элемент в списке, но…согласитесь, что, в данном случае, код на Delphi будет выглядеть более элегантно и понятно.
Условный оператор выбора switch
С одной стороны, изучив документацию по switch, понимаешь почему разработчики C# выбрали для него именно такой синтаксис и, что этот оператор, при должном навыке программирования в C# позволяет делать много всяких крутых штук, в отличие от оператора case...of
в Delphi. Но с другой стороны, по сравнению с Delphi switch в C# выглядит, мягко говоря, монструозно. Простой пример — в зависимости от заданного пользователем числа выполнить некую операцию. Код Delphi:
var i: integer; res: single; begin case i of 0: res:=1; 1,3,5: res:=i*i; 2: res:=i*i*i; 4: res:=i+1; else raise Exception.Create('Задано неверное число'); end; end;
Аналогичный код в C# будет выглядеть вот так:
int i = 3; float res; switch (i) { case 0: { res = 1; break; } case 1: case 3: case 5: { res = i * i; break; } case 2: { res = i * i * i; break; } case 4: { res = i + 1; break; } default: throw new Exception("Задано неверное число"); }
На мой взгляд, код Delphi, в этом случае, выглядит на много красивее и интуитивно понятнее. Конечно, в C# 8 появилась такая языковая конструкция, как «выражение switch» (не оператор), которая позволяет в отдельных случаях сделать код короче и понятнее, но, к сожалению, выражение можно использовать не всегда и, по-моему, только в .NET Core.
Распространение и совместимость приложений
Понятно, что в C# никуда не деться от использования .NET технологий (сам язык разрабатывался под .NET и для .NET) и, на данный момент, каких-либо серьезных проблем не возникает написать приложение и использовать его на любом компьютере с Windows. Но как же не привычно после Delphi получить при сборке exe-файл в 174 Кб и, чтобы его запустить на соседнем компьютере, скачивать и устанавливать ещё один с .NET Core «весом» в 47 Мб. А всё по тому, что у соседа .NET Core не установлен.
Возможно, что со временем в ОС Windows и появится возможность получить сразу всё необходимое для работы приложений C# без распространения вместе с exe дополнительных пакетов (фантастика, конечно, но кто знает), но пока дела обстоят именно так — хочешь, чтобы приложение запускалось везде и всегда — тащи вместе с ним всё, что использовал и устанавливай вместе со своей программкой.
Что касается совместимости. В Delphi, на сколько я помню, самая «жесть» по части переработки кода, в угоду современным тенденциям развития Delphi, случилась в момент перехода на Unicode. Были целые гайды по тому как, что и на что необходимо заменить, чтобы приложение начало работать так как и должно и использовать все возможности Unicode.
Сейчас, по-видимому, аналогичная ситуация складывается и с .NET. С появлением .NET Core стало достаточно проблематично переносить приложения с .NET Framework на новую платформу. Да есть куча всяких гайдов по переносу, утилиты для проверки совместимости и так далее, но для такого неподготовленного человека, как я, сходу вникнуть во все тонкости переноса приложения с .NET Framework на .NET Core было, прямо скажу, не легко. Хотя и получилось. Думаю, что с выходом новой платформы под названием .NET 5 начнется очередной виток переносов и гайдов на сотни страниц как такой переход осуществить наиболее безболезненно. Посмотрим.
Итог
В целом, могу сказать, что работа в C# сейчас не вызывает у меня никаких отрицательных эмоций. Да, что-то нравится, что-то не очень, но в целом — всё, что необходимо сделать получается. И, со временем, привыкаешь и к синтаксису и к особенностям самого языка. На данный момент проект над которым сейчас работаю состоит из двух частей, написанных на C# и Delphi. В Delphi осталась самая сложная часть расчётов, которые постоянно дорабатываются и пока нет никаких перспектив для того, чтобы этот код перекочевал в C#. В C# идет работа, в основном, с обработкой данных — анализ XML-файлов, сохранение индекса и так далее.
Как 11 лет назад для Delphi, так и для C# завел отдельный блог в котором, как и здесь, пишу про то,с чем сталкиваюсь в C#, чтобы, в случае чего, не потерять информацию и быстро вспомнить какие-то моменты по работе. Например, сейчас изучаю моменты по работе с Excel в C# — популярная, кстати, тема в этом блоге.