Я знаю, что преждевременная оптимизация - мать всего зла. Однако я определяю общий метод, который использует Reflection для извлечения его метаданных общего типа и хотел бы знать, вызывает ли вызов typeof(T)
несколько раз, как в следующем фрагменте кода:
private static Dictionary<Type, PropertyInfo[]> elementProperties;
private static T MakeElement<T>(SqlDataReader reader) where T : class, new() {
PropertyInfo[] properties;
if (elementProperties.ContainsKey(typeof(T)))
properties = elementProperties[typeof(T)];
else
properties = elementProperties[typeof(T)] = typeof(T).GetProperties();
// more code...
}
... менее эффективен, чем хранение объекта типа в переменной, как в следующем фрагменте кода:
private static Dictionary<Type, PropertyInfo[]> elementProperties;
private static T MakeElement<T>(SqlDataReader reader) where T : class, new() {
PropertyInfo[] properties;
Type type = typeof(T);
if (elementProperties.ContainsKey(type))
properties = elementProperties[type];
else
properties = elementProperties[type] = type.GetProperties();
// more code...
}
...
Если я правильно понимаю теорию компилятора (и думаю, что знаю), этот вопрос можно было бы свести к следующему:
Когда компилятор JIT создает экземпляр типового типа, он заменяет каждый экземпляр [независимо от представления MSIL typeof(T)
] с...
- ... ссылка на объект фактического типа? (Хорошо)
- ... вызов/подпрограмма метода/все, что получает ссылку на объект фактического типа? (Плохо)
- ... вызов/подпрограмма метода/независимо от того, что создает объект типа и возвращает ссылку на него? (очень, очень плохо)