Pull to refresh

Comments 17

Прошу прощения за сломанную верстку в самом начале: парсер md шалил
Намёк понял, надо вычитать ещё раз :)
DateTime — это структура, которая инкапсулирует в себе понятие момента времени. Она хранит эти данные в виде uint

Нет. Хранит оно в UInt64. Статья про .NET а алиасы(uint) из C#.


Мы получили абсолютно полный аналог боксинга.

Нет не получили. Анбоксинг не работает (int)value -> ошибка. Еще скрыли все доступные интерфейсы типа IComparable, IConvertible. Это обычная обертка.


Шутки ради можно даже сделать чтобы в методе финализации объекты воскрешали бы себя, засовывая обратно в пул объектов

Такие советы, даже в шутку, нельзя давать. Это 100% убить производительность и весь профит от пулинга.

1) обычная опечатка — исправлено
2) Анбоксинг будет работать как boxed.Value
3) Я же не написал что это надо делать :). int в структуру превращать знаете ли тоже сомнительное развлечение.
Кстати, можно же сделать неявное приведение типа обратно в T. Тогда вообще огонь )
Нет, кстати, не огонь. Потеряется возможность менять значение. Меняться-то копия будет
Boxed должен иметь ограничение — where T: struct. Иначе можем в него запихнуть ссылочный тип.
Не могли бы вы на пальцах пояснить эту математику?

В нашем примере с 4 байтами — 85К / (от 16 до 32 байт на поле * количество полей = 4) минус размер заголовка массива: примерно от 650 до 1300 элементов на массив в зависимости от платформы (а брать понятное дело надо в меньшую сторону). Всего-то! Не так и много! А ведь могло показаться что магическая константа в 1000 элементов вполне могла подойти!
И через простое unsafe преобразование *(Header *)readedBuffer без каких-либо десериализаций
Ага, «i just readed a book and it was unbad»
Мы с вами прошли как может показаться и огонь и воду и можем пройти любое собеседование. Возможно даже в команду .NET CLR.

Так думал я после нескольких лет работы в качестве .NET разработчика, пока не увидел код одного известного OpenSource проекта с использованием ILGenerator.
Чем плохо использование ILGenerator?
Диеамический код проще собрать на System.Linq.Expressions не имея экспертных знаний в IL и особенностей .NET(чего только стоит взамотношения с value-type).
Мне всегда казалось, что выбор намного проще: нужна семантика копирования, используем struct, нужна семантика ссылок — class. Рассуждения в статье действительно больше про преждевременную оптимизацию. А архитектурно важнее, копируем мы объект или расшариваем ссылку на него. Несколько некорректный, зато простой вывод: делайте неизменяемые структуры и изменяемые классы.
В свете неизменяемых классов и передаваемых по ссылке структур всё становится несколько запутаннее.
Неизменяемые классы или структуры по сути определяется просто, используем мы их через интерфейс или напрямую. Через интерфейс — класс, нет — структура. Насчет передаваемых по ссылке структур — есть ключевое слово in (C# 7.3), которое позволяет передавать неизменяемую ссылку. Соответственно неизменяемая ссылка на неизменяемую структуру не позволит с ней ничего сделать. Так что тут ничего вообще не меняется.
Sign up to leave a comment.