将一个对象铸造为相同的类型&;对性能的影响
本文关键字:amp 影响 性能 类型 一个对象 | 更新日期: 2023-09-27 18:07:58
一个关于将对象强制转换为相同类型的性能的问题(我知道一开始听起来很奇怪,但让我把它放在上下文中(
public T Get<T>(string key) where T : class
{
var objToReturn = (T)_cache[key];
if (objToReturn != null)
{
return objToReturn;
}
return null;
}
上面是一段代码片段,用于尝试从CacheObject
中获取类型为T
的对象,其中该类型由调用方强类型化。
知道由于对象的类型是强类型的,我想知道这一行:
var objToReturn = (T)_chache[key];
这真的会调用一个强制转换并将缓存中的实例转换为另一个实例并返回吗?还是会发现类型与简单忽略的强制转换相同。
我问,在稍后的应用程序开发中,强制转换的能力将很有用,这个缓存用于获取派生类型,但我不想在早期就造成潜在的重大性能损失。
思考并感谢您。
您显示的强制转换是一个"自然"引用类型的强制转换。它不会改变对象的任何内容——它只是确保对象具有适当的类型(可以是您要转换到的类型,也可以是子类(。如果对象的类型错误,则会引发异常。没有创建任何额外的对象或类似的对象。
当然,它不是免费的,但很少会成为性能瓶颈。
目前还不清楚你为什么会有这个代码:
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