在 Rider Resharper 中建议简化字符串插值。
执行此操作时,堆分配查看器插件会警告我有关装箱分配的信息。事实上,IL 代码是不同的,当运行秒表时,很明显简化的方法大约慢了 50%。
两个问题:
public string ToHexString1() => $"HexValue is: {uintVariable.ToString("X8")}"; //no boxing allocation
public string ToHexString2() => $"HexValue is: {uintVariable:X8}"; //boxing allocation
主要是因为它的代码更简单。除非您处于紧密循环中,否则您不应该担心装箱分配。这根本不值得考虑。编写易于理解的代码,并在必要时进行优化。
但是,在 .NET 6+ 中,这实际上更好。你可以在SharpLab中看到反编译给你:
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(13, 1);
defaultInterpolatedStringHandler.AppendLiteral("Hex Value is ");
defaultInterpolatedStringHandler.AppendFormatted(i, "X8");
return defaultInterpolatedStringHandler.ToStringAndClear();
没有拳击。
而在 .NET Framework 中你会得到:
return string.Format("Hex Value is {0:X8}", i);
哪些盒子
i
。