#c# #.net
#c# #.net
Вопрос:
В C # отражение неизменно начинается с:
myInstance.GetType();
Или:
typeof(MyType);
Чтобы получить Type
, затем, когда запрашивается информация о типе, например, получение свойств, полей, атрибутов и т. Д. они, безусловно, выполняют отражение.
Однако являются ли вышеупомянутые вызовы отражением самих себя?
Я полагаю, что в академическом смысле ответ «да» — потому что вы размышляете о типе. Итак, моя вторая часть вопроса такова: оценивается ли он во время выполнения и выполняет ли он выделение кучи в первый раз?(Я знаю, что последующие вызовы для GetType()
того же типа возвращают один и тот же Type
экземпляр, поэтому .NET должен кэшировать результат — но нужно ли было создавать новый тип при первом вызове? Или это что-то выполняется во время компиляции?
Ответ №1:
Объект, возвращаемый myInstance.GetType()
or typeof(MyType)
, является объектом в управляемой куче. Итак, в какой-то момент времени выполнения должно быть выполнено выделение. Очевидно, что компилятор не может выполнить управляемое выделение кучи. (Это в отличие от «функций» C / C , подобных sizeof
, где значение подставляется компилятором, что приводит к отсутствию затрат времени выполнения вообще.)
Итак, из этого вы можете сделать вывод, что Type
объекты либо создаются в момент загрузки вашей сборки, либо создаются «по требованию» при первом вызове таких методов, как myInstance.GetType()
или typeof(MyType)
.
Что из этого? Насколько я знаю, это не указано, поэтому трудно сказать. GetType()
, например, реализовано в самой среде выполнения:
[MethodImpl(MethodImplOptions.InternalCall)]
public extern Type GetType();
В любом случае, в какой-то момент должны возникнуть (чрезвычайно малые) накладные расходы во время выполнения на выделение Type
объекта для MyType
в управляемой куче.
Комментарии:
1. Интересно, являются ли
Type
s особенными и создаются ли они при загрузке сборки, но, как вы говорите: трудно сказать!2. @markmnl: Если бы мне пришлось угадывать , я бы сказал, вероятно, при загрузке сборки. Для меня это имело бы больше смысла. Но независимо от того, является ли предположение правильным или неправильным, оно (afaik) не определено — так что, вероятно, лучше не полагаться на такие детали реализации!