1

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

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

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

2 回答 2

4

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

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

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

于 2013-04-21T21:49:03.043 回答
1

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

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

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

于 2013-04-21T21:51:42.297 回答