Распределяет ли оператор typeof () в C # новый объект Type в куче или возвращает существующий? - PullRequest
9 голосов
/ 22 октября 2011

Должно быть довольно понятным, но это в контексте кода XNA в реальном времени, где я хочу избежать распределений, чтобы избежать запуска GC. Поэтому мне интересно, всегда ли управляемые объекты Type, связанные с загруженными типами, всегда присутствуют во время выполнения, или если typeof () фактически создает новый объект Type (предположительно из неуправляемых метаданных во время выполнения) в куче, которая будет собирать мусор. Не стесняйтесь указывать на любые невежественные предположения / неправильные представления, выявленные, даже задавая этот вопрос =)

Ответы [ 2 ]

17 голосов
/ 22 октября 2011

Нет, типы кэшируются, он всегда возвращает один и тот же статический экземпляр только для чтения.

Вы можете написать эту тестовую программу для проверки:)

static void MyTest()
{
    if (object.ReferenceEquals(typeof(int), typeof(int))
        Console.WriteLine("Yippie! they are the same!");
    else
        Console.WriteLine("WTF?");
}

То же самое относится к методу GetType и ко всем другим функциям отражения, таким как получение свойств, методов, полей, атрибутов и всего остального.

16 голосов
/ 22 октября 2011

Из раздела 7.6.11 спецификации C # 4:

Существует только один System.Type объект для любого данного типа. Это означает, что для типа T, typeof(T) == typeof(T) всегда верно.

(Кроме того, если вы получаете тип с помощью отражения, он всегда будет извлекать один и тот же объект Type, но это не указано в спецификации.)

...