Skip to content

Instantly share code, notes, and snippets.

@eterekhin
Last active April 27, 2020 07:22
Show Gist options
  • Save eterekhin/c98319db3ae69ca73569776dcf8c0cf7 to your computer and use it in GitHub Desktop.
Save eterekhin/c98319db3ae69ca73569776dcf8c0cf7 to your computer and use it in GitHub Desktop.

Почему происходит упаковка структуры при обращении к методу базового класса?

Базовый класс в данном случае это ValueType(отличие классов от структур - структуры наследуются от ValueType, классы от Object), и методы этого класса принимают первым параметром ValueType или Object(оба ссылочные. Поэтому для вызова метода базового типа структура упаковывается и передается неявным this. Но вообще наследование структур запрещено, так что наследование возможно только от ValueType'a.

Почему для простых типов не происходит упаковки при вызове их базовых методов

Потому что они переопределяют методы базового типа, когда структура переопределяет метод базового типа, то его можно вызвать прямо без обращения к таблице виртуальных методов.

Чем плох enum в данном контексте и как обойти проблему излишних аллокаций при использовании enum'ов (https://habr.com/ru/post/343430/)

Проблема в том, что Enum не может переопределить методы базового класса (equals, gethashcode), насколько я понимаю, сложность в том, что Enum может описывать сколько угодно членов внутри себя, поэтому провести корректную реализацию методов в Equals и GetHashCode невозможно.
Как обойти: если необходимо сравнивать, то нужно использовать EqualityComparer.Default, он замыкается на вызов extern функции, таким образом мы заменим упаковку enum'a, на вызов виртуального метода Equals, класса EqualityComparer

Как происходит сравнение простых типов (1>2, например)

Я выписал некоторые возможные ситуации, только при работе с decimal, происходит вызов метода, остальные операторы транслируются как в IL код , так и в байт код:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment