我对字符串分配感到好奇。如果我有一个名为mystring = "test"
的常量,我可以在应用程序的任何地方使用“test”而无需分配任何新数据吗?请参阅下文,此方法是否会分配任何新数据?
const string mystring = "test"
void test()
{
for(int i = 0; i < 100000;i++)
{
allocationTest();
}
}
void allocationTest()
{
Console.Write("test");
}
答案 0 :(得分:4)
不,该方法不会分配任何数据。
编译器将合并任何重复的字符串文字,因此两个文本文件"test"
实际上是应用程序启动时创建的一个字符串。
此外,即使字符串不存在于两个位置,在使用它时也永远不会分配字符串文字,它是在应用程序启动时分配的。使用引用字符串的常量对方法中使用的字符串文字没有区别。
答案 1 :(得分:1)
如果编译器在一个项目的代码中找到两个常量字符串值,它将使用一个实例。
如果编译在多个项目的代码中找到两个常量字符串值,则每个项目(dll或exe)都会获得自己的实例。这是因为dll的/ exe应该能够单独运行。
如果在运行时期间创建了字符串(例如,通过逐行读取文件或从数据库中读取数据),则每个字符串(即使它具有相同的值)将成为单独的实例。这可以通过使用函数string.Intern来防止(参见:http://msdn.microsoft.com/en-us/library/system.string.intern.aspx)。