Являются ли GetType() и typeof() отражением?

#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) не определено — так что, вероятно, лучше не полагаться на такие детали реализации!