将对象转换为相同类型及其对性能的影响

Kir*_*ida 3 c# performance casting

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

public T Get<T>(string key) where T : class
{
     var objToReturn = (T)_cache[key];
     if (objToReturn != null)
     {
         return objToReturn;
     }
     return null;
}
Run Code Online (Sandbox Code Playgroud)

上面是一段代码,用于尝试从调用者强类型化的类型T中获取该类型的对象。CacheObject

知道对象的类型是强类型的,我想知道这一行:

var objToReturn = (T)_chache[key];
Run Code Online (Sandbox Code Playgroud)

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

我问,因为转换的能力将在以后的应用程序开发中有用,该缓存用于获取派生类型,但我不想在早期产生潜在的重大性能影响。

思考并感谢你。

Jon*_*eet 5

您显示的转换是“自然”引用类型转换。它不会改变对象的任何内容 - 它只是确保该对象属于适当的类型(无论是您要转换到的类型还是子类)。如果对象的类型错误,则会引发异常。不会创建额外的对象或类似的东西。

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

目前还不清楚为什么你会得到这段代码:

if (objToReturn != null)
{
    return objToReturn;
}
return null;
Run Code Online (Sandbox Code Playgroud)

为什么不直接使用:

return objToReturn;
Run Code Online (Sandbox Code Playgroud)

?这将表现出完全相同的方式。那么你的整个方法可以简化为:

public T Get<T>(string key) where T : class
{
    return (T) _cache[key];
}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,您应该只是使用as相反,除非您确实希望将错误类型的值默默地返回为null. 例如:

cache[key] = new object();
string x = cache[key] as string; // x is null
string y = (string) cache[key]; // Exception
Run Code Online (Sandbox Code Playgroud)