声明具有相同内容的多个字符串文字会分配额外的内存吗?

时间:2013-04-21 21:37:37

标签: c# memory-management

我对字符串分配感到好奇。如果我有一个名为mystring = "test"的常量,我可以在应用程序的任何地方使用“test”而无需分配任何新数据吗?请参阅下文,此方法是否会分配任何新数据?

const string mystring = "test"
void test()
{
    for(int i = 0; i < 100000;i++)
    {
        allocationTest();
    }        
}

void allocationTest()
{
    Console.Write("test");
}

2 个答案:

答案 0 :(得分:4)

不,该方法不会分配任何数据。

编译器将合并任何重复的字符串文字,因此两个文本文件"test"实际上是应用程序启动时创建的一个字符串。

此外,即使字符串不存在于两个位置,在使用它时也永远不会分配字符串文字,它是在应用程序启动时分配的。使用引用字符串的常量对方法中使用的字符串文字没有区别。

答案 1 :(得分:1)

如果编译器在一个项目的代码中找到两个常量字符串值,它将使用一个实例。

如果编译在多个项目的代码中找到两个常量字符串值,则每个项目(dll或exe)都会获得自己的实例。这是因为dll的/ exe应该能够单独运行。

如果在运行时期间创建了字符串(例如,通过逐行读取文件或从数据库中读取数据),则每个字符串(即使它具有相同的值)将成为单独的实例。这可以通过使用函数string.Intern来防止(参见:http://msdn.microsoft.com/en-us/library/system.string.intern.aspx)。