在 C# 中,常量的串联是否在编译时优化为串联形式?
Does concatenation of constants get optimized to the concatenated form at compile time in C#?
我有两个常量,定义在同一个静态class:
public static class MyConstants {
public const string ABC = "ABC";
public const string DEF = "DEF";
}
我在我的应用程序的其他地方以组合方式使用它们:
Console.WriteLine(MyConstants.ABC + MyConstants.DEF);
我正在尝试确定串联是否在编译时进行了优化,导致程序集在反汇编时在某个地址包含值 ABCDEF
,或者它是否保持独立。我按照 this MSDN post 上的说明在控制台应用程序中查看我的代码的反汇编,它似乎没有存储为 ABCDEF
,也没有单独存储为 ABC
、DEF
:
This post 是一本好书,但最终让我对我的问题感到困惑(可能是因为我缺乏 C++ 知识)。我已经查看了其他几篇文章,但似乎并没有真正接近答案。
C# 是否优化了应用程序编译版本中两个常量的串联,any/everywhere 使用了串联?
注意:目标是进一步混淆 ABCDEF
的完整值,使其更难找到。
是的,连接后的字符串是 interned see: .NET-Fiddle
public class Program
{
public static void Main()
{
string abcdef = MyConstants.ABC + MyConstants.DEF;
if(string.IsInterned(abcdef) != null)
{
Console.Write("abcdef is interned");
}
}
}
public static class MyConstants {
public const string ABC = "ABC";
public const string DEF = "DEF";
}
我想 Jon 也在这里回答了这个问题:
我有两个常量,定义在同一个静态class:
public static class MyConstants {
public const string ABC = "ABC";
public const string DEF = "DEF";
}
我在我的应用程序的其他地方以组合方式使用它们:
Console.WriteLine(MyConstants.ABC + MyConstants.DEF);
我正在尝试确定串联是否在编译时进行了优化,导致程序集在反汇编时在某个地址包含值 ABCDEF
,或者它是否保持独立。我按照 this MSDN post 上的说明在控制台应用程序中查看我的代码的反汇编,它似乎没有存储为 ABCDEF
,也没有单独存储为 ABC
、DEF
:
This post 是一本好书,但最终让我对我的问题感到困惑(可能是因为我缺乏 C++ 知识)。我已经查看了其他几篇文章,但似乎并没有真正接近答案。
C# 是否优化了应用程序编译版本中两个常量的串联,any/everywhere 使用了串联?
注意:目标是进一步混淆 ABCDEF
的完整值,使其更难找到。
是的,连接后的字符串是 interned see: .NET-Fiddle
public class Program
{
public static void Main()
{
string abcdef = MyConstants.ABC + MyConstants.DEF;
if(string.IsInterned(abcdef) != null)
{
Console.Write("abcdef is interned");
}
}
}
public static class MyConstants {
public const string ABC = "ABC";
public const string DEF = "DEF";
}
我想 Jon 也在这里回答了这个问题: