Зачем вызывать некоторые функции класса Object для экземпляра примитивного типа? - PullRequest
10 голосов
/ 01 февраля 2010

Я обнаружил, что если я запускаю следующие строки кода.

int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
                 //function from System.Object

Бокс не выполняется, но если я вызову i.GetType() (другую производную функцию от System.Object) вместо GetHashCode(), бокс должен будет вызвать GetType(), почему невозможно вызвать GetType() Примитивный тип экземпляра напрямую, без бокса, в то время как можно вызвать GetHashCode() без бокса?

Ответы [ 3 ]

8 голосов
/ 01 февраля 2010

Ключевым моментом здесь является то, что GetType() не является виртуальным и не может быть переопределено. Поскольку структура фактически sealed, методы не могут быть переопределены на больше , чем структура, поэтому среда выполнения и компилятор могут обрабатывать методы структуры , которые были переопределены , как статические вызовы. *

Если вы пишете структуру (редко), вы должны переопределить все методы, такие как ToString(), Equals(), GetHashCode() именно по этой причине. Если вы этого не сделаете, он должен боксировать. Тем не менее, GetType() нельзя переопределить , поэтому требуется бокс.

Это на самом деле приводит к некоторым странным крайним случаям с Nullable<T> и боксом, поскольку пустые Nullable<T> боксы к null, поэтому:

int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom
2 голосов
/ 01 февраля 2010

Я думаю, причина в том, что GetHashCode реализован непосредственно в System.Int32, вы вызываете System.Int32 :: GetHashCode (). Не нужно ставить флажок, если вы вызываете известную функцию-член для типа значения.

1 голос
/ 01 февраля 2010

Кажется, очень близко к Как ValueType.GetType () может определить тип структуры ?

Также относится к путанице GetType и TypeOf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...