我开始深入研究新的 C#/.net 核心功能(称为 Span 和 Memory),到目前为止它们看起来非常好。然而,当我遇到MemoryMarshal.AsMemory方法时,我发现了以下有趣的用例:
const string source1 = "immutable string";
const string source2 = "immutable string";
var memory = MemoryMarshal.AsMemory(source1.AsMemory());
ref char first = ref memory.Span[0];
first = 'X';
Console.WriteLine(source1);
Console.WriteLine(source2);
Run Code Online (Sandbox Code Playgroud)
两种情况下的输出都是Xmmutable string(在 Windows 10 x64、.net471 和 .netcore2.1 上测试)。据我所知,任何被保留的字符串现在都可以在一处进行修改,然后对该字符串的所有引用都将使用更新后的值。
有什么办法可以防止这种行为吗?是否可以“取消”字符串?