修改字符串合法吗?

Is it legal to modify strings?

使用固定语句可以有一个指向字符串的指针。他们可以使用该指针修改字符串。但在 C# 文档中是否合法允许?

using System;

class Program
{
    static void Main()
    {
        string s = "hello";
        unsafe
        {
            fixed (char* p = s)
            {
                p[1] = 'u';
            }
        }
        Console.WriteLine("hello");
        Console.Write("hello" + "\n");
        Console.ReadKey();
    }
}

// hullo
// hello

上面的程序修改了一个字符串文字。

法律是一个强有力的词,但是是的,你可以。我再补充一点,除非绝对必要,否则不要使用它。

"Legal" 可能用错了词。 "Incorrect" 就是我要说的。 可能,但字符串在 C# 中是 defined as immutable。通过改变一个无论如何你违反了 class 不变量。运行时可以随心所欲地对其做出反应,包括 "apparently working"、"falling over" 或 "stealing your credit card info to buy tacos"*。 unsafe 关键字的全部要点是你引入一段代码,其中你说 "OK I know you can't show this is safe, but trust me I know what I'm doing and it totally is".

*:在这种特殊情况下,更可能的风险是编译器和运行时之间的某个地方,多个阶段完全可以内联和常量折叠访问字符串文字,但其他取决于代码的细微变化,这意味着您可能会在运行时得到不一致的结果。最重要的是,不要这样做。

根据 language specification:

Modifying objects of managed type through fixed pointers can results [sic] in undefined behavior. For example, because strings are immutable, it is the programmer's responsibility to ensure that the characters referenced by a pointer to a fixed string are not modified.

(我的重点

因此,它在语言中有明确的考虑,您并不打算这样做,但这是的责任,而不是编译器的责任。