C# Это не страшно

Пост обновлен февр. 8

#python #csharp #beginner


Думаю, многие пользователи динамо, освоившие или осваивающие написание скрипов на питоне, находятся во власти заблуждения, что вот C# - это жесть, ужас, убьет током. Это не так.


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

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


Конвертация таблицы в словарь


Пусть это будет таблица с параметрами. Первый столбец - GUID, 2 и 3 - Имя и Тип.

Сам алгоритм можно представить в таком виде:

  1. Отделить первую строку с названиями столбцов

  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/Статическая_типизация


Просмотров: 177
  • YouTube - Белый круг
  • Facebook - Белый круг
  • Instagram - Белый круг

+7 (495) 766-89-13

Россия, город Москва, проспект Мира д.3 стр.3, эт. 4 

м. Сухаревская (выход 3)