虽然这样做对我们的应用一些分析,我发现这个代码:原始类型转换,无需拳击
public TOut GetValue<TIn, TOut>(Func<TIn> getter)
{
var value = getter();
// Do some stuff with the value
return (TOut)Convert.ChangeType(value, typeof(TOut));
}
TIn
和TOut
的是int,double或字符串。
由于使用int或double时的装箱,这在分析会话中显示为堆分配的重要来源。输入值Convert.ChangeType
被装箱,因为该方法需要一个对象,并且出于同样的原因返回值被装箱。
我想优化此代码,因为此方法用于高吞吐量服务,这种分配是禁止的。理想情况下,我会将该方法改写为非通用方法,但API被各个团队广泛使用,重构此类规模需要数月时间。与此同时,我正试图缓解这个问题,并找到一种方法来改善这种情况,而无需更改API合同。然而,我一直在这方面挣扎了一段时间,还没有找到解决办法。
你知道一个方法,甚至丑陋的,以处理int - > double和double - > int转换没有拳击,给定的方法合同?请注意,我无法更改参数,但我可以添加通用约束(例如where TIn : IConvertible
,但这对我没有多大帮助)。
换句话说,你想要通用的'ChangeType'?您可以使用[“switch/case”](http://referencesource.microsoft.com/#mscorlib/system/convert.cs,348)来查看您关心的所有类型,或者使用盒装版本。 – Sinatr
也许看看[.NET参考资源的Convert.ChangeType](http://referencesource.microsoft.com/#mscorlib/system/convert.cs,dc591cb7008278c6)将有助于了解它的功能,也许可以让你为您的特定场景创建一个更短/更快/更高效的方法。 –