为什么字符串指针位置不同?

时间:2015-01-07 16:45:01

标签: c# pointers string-interning unsafe-pointers

为什么每次运行应用程序时字符串指针的位置都不同,当我使用StringBuilder时,但是当我声明变量时它是一样的?

void Main()
{
    string str_01 = "my string";
    string str_02 = GetString();
    unsafe 
    {
        fixed (char* pointerToStr_01 = str_01)
        {
            fixed (char* pointerToStr_02 = str_02)
            {
                Console.WriteLine((Int64)pointerToStr_01);
                Console.WriteLine((Int64)pointerToStr_02);
            }
        }
    }
}

private string GetString()
{
    StringBuilder sb = new StringBuilder();
    sb.Append("my string");

    return sb.ToString();
}

输出:

  

40907812
  178488268

下次:

  

40907812
  179023248

下次:

  

40907812
  178448964

3 个答案:

答案 0 :(得分:1)

仅仅因为两个字符串是相同的并不意味着它们指向相同的引用(我猜这意味着具有相同的指针),C#不会因为性能考虑因素而自动生成所有字符串。如果您希望两个字符串的指针相同,则可以使用str_02实习string.Intern

答案 1 :(得分:1)

当我使用固定时,它将分配一个内存
因为str_01是常量字符串,所以它在执行时分配内存并且每次都指向相同的位置

fixed (char* pointerToStr_01 = str_01)

但如果是

fixed (char* pointerToStr_02 = str_02)

它动态分配内存因此指针位置每次都变化

因此,每次运行

时,字符串指针都会有差异

答案 2 :(得分:0)

我不同意

的输出
 Console.WriteLine((Int64)pointerToStr_01);

总是和我个人测试一样,以使我的观点更清楚。

让我们看看两种情况:

  • 如果是字符串str_01 ="我的字符串",当您打印此变量的指针值时,它将与之前的相同,因为每次创建一个新的String对象(即字符串是不可变的) )和"我的字符串"分配给它。然后在Fixed语句中打印指针的值,当您再次执行程序时,该值超出范围,并且不会记住先前的值。
  • 我想,到现在为止你可以自我解释StringBuilder的行为。

同时查看:

 string str_01 = GetString();
 private static string GetString()
    {
        var sb = new String(new char[] {'m','y',' ','s','t','r','i','n','g'});
        return sb;
    }