我从通用解析器知道OP在此问题中发布的类似代码。从性能的角度来看,你应该使用Unsafe.As<TFrom, TResult>(ref TFrom source)
,可在发现System.Runtime.CompilerServices.Unsafe NuGet包。在这些情况下,它避免为值类型装箱。我还认为,这Unsafe.As
导致JIT生成的机器代码少于两次(使用(TResult) (object) actualString
)进行强制转换的机器代码,但我尚未对此进行检查。
public TResult ParseSomething<TResult>(ParseContext context)
{
if (typeof(TResult) == typeof(string))
{
var token = context.ParseNextToken();
string parsedString = token.ParseToDotnetString();
return Unsafe.As<string, TResult>(ref parsedString);
}
else if (typeof(TResult) == typeof(int))
{
var token = context.ParseNextToken();
int parsedInt32 = token.ParseToDotnetInt32();
// This will not box which might be critical to performance
return Unsafe.As<int, TResult>(ref parsedInt32);
}
// other cases omitted for brevity's sake
}
Unsafe.As
可以在JIT中使用有效的机器代码说明来代替,如您在官方CoreFX存储库中所看到的: