【发布时间】:2015-09-08 18:37:08
【问题描述】:
我知道字符串是不可变的,对字符串的任何更改只会在内存中创建一个新字符串(并将旧字符串标记为空闲)。但是,我想知道我下面的逻辑是否合理,因为您实际上可以以循环方式修改字符串的内容。
const string baseString = "The quick brown fox jumps over the lazy dog!";
//initialize a new string
string candidateString = new string('\0', baseString.Length);
//Pin the string
GCHandle gcHandle = GCHandle.Alloc(candidateString, GCHandleType.Pinned);
//Copy the contents of the base string to the candidate string
unsafe
{
char* cCandidateString = (char*) gcHandle.AddrOfPinnedObject();
for (int i = 0; i < baseString.Length; i++)
{
cCandidateString[i] = baseString[i];
}
}
这种方法确实改变了内容candidateString(没有在内存中创建新的candidateString)还是运行时看穿了我的技巧并将其视为普通字符串?
【问题讨论】:
-
运行代码并亲自了解会发生什么。
-
因为我只能看到最终结果,而看不到内存中发生的事情。
-
在
cCandidateString[i] = baseString[i]行放置一个断点,并观察candidateString在每次迭代中的变化。有趣的东西! -
是的,没问题。你知道,不安全的代码是不安全的。它也不需要 unsafe 关键字,摸索 [DllImport] 并在需要 StringBuilder 的地方声明字符串也可以完成。当你传递一个字符串文字时非常有趣。曾经甚至可以使用 Reflection 更改 String.Empty,但他们阻止了这一点。
标签: c#