3

关于将对象转换为相同类型的性能的问题(我知道一开始听起来很奇怪,但让我把它放在上下文中)

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];

这实际上会调用强制转换并将缓存中的实例转换为另一个实例并返回该实例,还是会发现类型与简单忽略的强制转换相同。

我要求强制转换的能力在以后开发该缓存用于获取派生类型的应用程序时很有用,但我不想在早期产生潜在的主要性能影响。

想法和谢谢。

4

1 回答 1

4

您展示的演员表是“自然”参考类型演员表。它不会改变对象的任何内容 - 它只是确保对象是适当的类型(您要转换为的类型或子类)。如果对象的类型错误,则会引发异常。不会创建额外的对象或类似的东西。

它当然不是免费的——但这很少会成为性能瓶颈。

目前尚不清楚为什么你有这个代码:

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
于 2013-04-08T14:25:05.570 回答