假设您有这样的 C# 代码:
const string ABC = "ABC";
const string XYZ = "XYZ";
var result = ABC + ":" + XYZ;
此类代码由编译器优化,因此结果变量中有一个常量字符串文字“ABC:XYZ”,而不是在运行时实际连接 3 个字符串。
现在我想介绍一个辅助函数,它将对用户隐藏该连接(以使代码更健壮且不易出错):
[MethodImpl(MethodImplOptions.AggressiveInlining)]
static string Combine(string first, string second) => first + ":" + second;
const string ABC = "ABC";
const string XYZ = "XYZ";
var result = Combine(ABC, XYZ);
在这种情况下,我看到该方法实际上是内联在调用方法中的,但在反汇编中我可以清楚地看到它string.Concat(string a, string b, string c)
在运行时调用,而不是有一个常量字符串文字“ABC:XYZ”。
我知道在编译过程中速度和质量之间存在平衡,但是有什么技巧可以让该Combine
方法作为 C++ 宏工作以避免在运行时出现多余的字符串连接?
PS 引入只计算一次的静态只读字符串并不是问题的答案。