Форум программистов, компьютерный форум, киберфорум
Наши страницы

Заметки про C#. А знали ли вы?

Войти
Регистрация
Восстановить пароль
Оценить эту запись

Заметки про C#. А знали ли вы?

Запись от netBool размещена 08.05.2018 в 12:29

Погружаясь в леса и дебри Reflection и IL, постепенно узнаю много новых вещей о .NET, о которых раньше даже не задумывался. И хотел бы поделиться некоторыми из них (буду дописывать по мере наличия свободного времени):

1. Тип void
Знали ли вы, что в C# void - не просто ключевое слово для обозначения функции, не возвращающей значение, а полноценных тип данных?

Несколько фактов о нем:
  • В С# нельзя просто так объявить экземпляр типа void. Сам тип можно получить через typeof(void)
  • Тип void подобен структуре: этот тип не является примитивом, но в то же время считается значимым типом
  • В C#, как в С++, нельзя разыменовать void:*void, несмотря на то, что он является значимым типом. По сути void* - не что иное, как неуправляемый аналог IntPtr

2. Делегаты

На уровне IL все - классы, интерфейсы, структуры и даже делегаты - все является классами. Но делегаты выделяются из всей этой кучи. Delegate - это особый класс в .NET Framework. Он не объявлен как sealed, но мы не можем явно наследовать от него свои классы (так же, как и от MulticastDelegate). Но когда мы пишем
C#
1
delegate void EmptyDelegate();
Мы на самом деле объявляем класс, унаследованный от Delegate и MulticastDelegate.

3. Исходники

Майкрософт выложила исходный код .NET Framework, а так же компилятора Roslyn, изъяв ото всюду старый нативный компилятор. И у многих программистов сложилось впечатление, что весь .NET написан на C#. Но мало кто заглядывал под капот: сам jit-компилятор, "виртуальная машина" и многое другое написаны на С++ и assembler, в том числе assembler ARM/ARMx64

4. Хранение больших объектов в памяти

Принято считать, что CLR для ссылочных типов хранит только ссылку на объект, а сам под сам объект выделяется память где-то в куче. Но мало кто догадывается, поскольку об этом не пишут в учебниках, что
Цитата:
CLR работает с объектами, размер которых больше или равен 85000 байтам, иначе, чем с объектами меньшего размера. Большие объекты создаются в Large Object Heap (LOH), а объекты меньшего размера — в обычной куче, GC Heap, что позволяет оптимизировать выделение памяти под объекты и сбор мусора. LOH не уплотняется, а GC Heap уплотняется при каждом сборе мусора. Кроме того, сбор мусора в LOH осуществляется только при полном сборе мусора.
Вероятно, это и есть причина тому, что NET-программы, работающие с большими объемами данных в памяти, не успевают очищать ее. И этот тот самый момент, на который стоит уделить особое внимание разработчиков таких программ

5. IL-код
Как мы знаем код C#, а так же VB.NET, и других .NET языков компилируется не в машинные инструкции, а в так называемый промежуточный байт-код, описываемый на языке MSIL. Подробное описание инструкций IL-ассемблера можно нати на msdn в описании класса System.Reflection.Emit.Opcodes. Но следует знать, что там описаны только часть инструкций. Например, там нет описания инструкций no и break.
Размещено в C#/WinForms
Просмотров 472 Комментарии 5
Всего комментариев 5

Комментарии

  1. Старый комментарий
    Аватар для Avazart
    Цитата:
    В отличие от C++, где указатель на void является своеобразным универсальным указателем, в C# нельзя разыменовать void: *void, несмотря на то, что он является значимым типом
    Во первых в С# не юзают как правило указатели.
    Во вторых в С++ void* тоже не удастся разыменовать, можно привести его как другому типу указателя и потом разыменовать.
    Запись от Avazart размещена 08.05.2018 в 12:57 Avazart вне форума
  2. Старый комментарий
    Аватар для netBool
    Цитата:
    Во первых в С# не юзают как правило указатели.
    Юзают в unsafe режиме
    Цитата:
    Во вторых в С++ void* тоже не удастся разыменовать, можно привести его как другому типу указателя и потом разыменовать.
    Да, точно)) Спасибо за замечание. Сейчас исправлю))
    Запись от netBool размещена 08.05.2018 в 17:34 netBool вне форума
  3. Старый комментарий
    Аватар для Avazart
    Цитата:
    Юзают в unsafe режиме
    А много людей пишут в unsafe режиме ?
    Запись от Avazart размещена 08.05.2018 в 18:02 Avazart вне форума
  4. Старый комментарий
    Аватар для Rius
    Это вовсе не круто.
    Те, кому это надо, используют сразу C/C++, а не эти костыли в виде unsafe.
    Запись от Rius размещена 08.05.2018 в 19:10 Rius вне форума
  5. Старый комментарий
    Аватар для netBool
    Цитата:
    Это вовсе не круто.
    Я просто восхищен тем, что на шарпе это тоже можно делать

    Цитата:
    Те, кому это надо, используют сразу C/C++, а не эти костыли в виде unsafe.
    В C/C++ в целом по работе с указателями, разумеется, больше возможностей и работать удобнее. Но иногда какую-нибудь мелочь проще реализовать на шарпе, чем постоянно дергать DllImport

    PS: Я на самом деле нисколько не фанат unsafe-C# в рабочих проектах. Мне скорее интересны эти возможности для личного велосипедирования и спортивного интереса
    Запись от netBool размещена 09.05.2018 в 11:44 netBool вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru