C# Это не страшно
Пост обновлен 8 февр. 2020 г.
Думаю, многие пользователи динамо, освоившие или осваивающие написание скрипов на питоне, находятся во власти заблуждения, что вот C# - это жесть, ужас, убьет током. Это не так.
На примере условно-практической задачи, конвертации списка списков (например таблицы из экселя) в словарь, я покажу основные отличия в коде этих двух языков, и кратко расскажу про отличия динамической типизации от статической.
После этого вы не сможете сразу все бросить и писать на C#, но это может стать отправной точкой для начала работы с другими языками.
Конвертация таблицы в словарь
Пусть это будет таблица с параметрами. Первый столбец - GUID, 2 и 3 - Имя и Тип.
Сам алгоритм можно представить в таком виде:
Отделить первую строку с названиями столбцов
Создать пустой словарь
Для каждой последующей строки таблицы: Добавить в словарь пару ключ-значение, где ключ - GUID, а значение - словарь. В котором ключи это названия столбцов, а значения понятно что.
Python
C#
Серым отмечена "бюрократия" которой нет в питоне, но которая обязательна в большинстве типизированных языков. Если представить что ее нет, то основным отличием в коде этих двух примеров будет { ... } вместо : и ; в конце каждой строки.
Основные этапы и ключевые отличия от python:
Точка входа
Любая программа написанная на C# начинается отсюда (есть нюансы).
public static void пока отложим.
Объявление переменных
Python
a = 1 - в любой момент мы можем записать в a другое значение: -1, 2000, даже c другим типом данных: "abc", [1, 2, 3], false. Тип переменной может в любой момент быть динамически изменен (в момент исполнения программы).
C#
var a = 1; - используя ключевое слово var мы поручаем компилятору определить тип переменной, мы как бы говорим: "вот переменная a, пусть она будет того же типа что и фигня по ту сторону =". В следующей раз при попытке присвоить a любое не целое (int) значение программа просто не скомпилируется, а IDE будет верещать о том что мы не правы.
string a = "hello"; - сразу указываем тип переменной. В Java, например, var нет и словарь из пункта 4 создавался бы только так 😱: HashMap<int, Hashmap<String, String>> myDict = new HashMap<int, Hashmap<String, String>>();
dynamic a = 1; - то же поведение что и в python.
Тип переменной в С# определяется в момент объявления и не может быть изменен (кроме dynamic).
Первая строка таблицы
вместо питоновского head = param_table.pop(0)
Словарь
Экземпляры объектов (в шарпе как и в питоне все объекты) создаются с помощью ключевого слова new
Dictionary<int, Dictionary<string, object>> - мы жестко указываем что paramDict это словарь у которого ключи обязательно целые числа, a значения - словари, у которых ключи обязательно строки, а значения так уж и быть любые (типа как в екселе).
for loop
Просто другой синтаксис
zip
В отличии от питона Zip() это не системная функция а метод списка.
Колдунства с => пока отложим.
Расплата за универсальность списка списков paramTable
без as string мы бы получили ошибку: Cannot implicitly convert type 'object' to 'string'.
Eсли бы при объявлении переменной мы использовали ключевое слово var в этом месте ошибки бы не было, но аналогичная ошибка появилась бы тут:
paramProperties[propName] = prop.Value; так как propName, используемый в качестве ключа, вместо типа string получил бы object.
Вообще это называется приведение типов (typecasting) и это отдельная тема.
Зачем это все
Ответ долгий, позволю себе копипасту из википедии.
Чем динамическая типизация хуже статической:
Статическая типизация позволяет уже при компиляции заметить простые ошибки «по недосмотру». Для динамической типизации требуется как минимум выполнить данный участок кода.В объектно-ориентированных языках не действует, либо действует с ограничениями, автодополнение: трудно или невозможно понять, к какому типу относится переменная, и вывести набор её полей и методов
Развитая статическая система типов играет значительную роль в самодокументировании программы; динамическая типизация по определению не проявляет этого свойства, что затрудняет разработку структурно сложных программ
Снижение производительности из-за трат процессорного времени на динамическую проверку типа, и излишние расходы памяти на переменные, которые могут хранить «что угодно». К тому же большинство языков с динамической типизацией интерпретируемые, а не компилируемые.
Конечно все эти весомые пункты не как не могут оспорить тот факт, что питон красивый и выразительный.
https://ru.wikipedia.org/wiki/Динамическая_типизация
https://ru.wikipedia.org/wiki/Статическая_типизация