关于将对象转换为相同类型的性能的问题(我知道这听起来很奇怪,但让我把它放在上下文中)
public T Get<T>(string key) where T : class
{
var objToReturn = (T)_cache[key];
if (objToReturn != null)
{
return objToReturn;
}
return null;
}
上面是一段代码,用于尝试从T
中获取CacheObject
类型的对象,其中类型由调用者强类型化。
知道看到对象的类型是强类型的,我想知道这一行:
var objToReturn = (T)_chache[key];
这实际上是否会在缓存中调用一个强制转换实例并将其转换为另一个实例并返回该实例,或者发现这些类型与被忽略的强制转换相同。
我问,由于能够在以后的开发中使用此缓存用于获取派生类型,但我不想在早期的潜在主要性能影响中进行繁殖。
思考并感谢你。
答案 0 :(得分:3)
您展示的演员表是“自然”参考类型演员。它不会改变关于对象的任何内容 - 它只是确保对象具有适当的类型(您要转换的对象或子类)。如果对象的类型错误,则抛出异常。没有创建额外的对象,或类似的东西。
当然不是免费的 - 但这很难成为性能瓶颈。
目前尚不清楚为什么你有这个代码:
if (objToReturn != null)
{
return objToReturn;
}
return null;
为什么不使用:
return objToReturn;
?这将表现完全相同。然后你的整个方法可以简化为:
public T Get<T>(string key) where T : class
{
return (T) _cache[key];
}
编辑:请注意,不只需使用as
,除非您确实希望将错误类型的值静默返回为null
。例如:
cache[key] = new object();
string x = cache[key] as string; // x is null
string y = (string) cache[key]; // Exception