为什么每次运行应用程序时字符串指针的位置都不同,当我使用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
答案 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);
总是和我个人测试一样,以使我的观点更清楚。
让我们看看两种情况:
同时查看:
string str_01 = GetString();
private static string GetString()
{
var sb = new String(new char[] {'m','y',' ','s','t','r','i','n','g'});
return sb;
}