修改字符串合法吗?
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".
*:在这种特殊情况下,更可能的风险是编译器和运行时之间的某个地方,多个阶段完全可以内联和常量折叠访问字符串文字,但其他取决于代码的细微变化,这意味着您可能会在运行时得到不一致的结果。最重要的是,不要这样做。
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.
(我的重点)
因此,它在语言中有明确的考虑,您并不打算这样做,但这是您的责任,而不是编译器的责任。
使用固定语句可以有一个指向字符串的指针。他们可以使用该指针修改字符串。但在 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".
*:在这种特殊情况下,更可能的风险是编译器和运行时之间的某个地方,多个阶段完全可以内联和常量折叠访问字符串文字,但其他取决于代码的细微变化,这意味着您可能会在运行时得到不一致的结果。最重要的是,不要这样做。
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.
(我的重点)
因此,它在语言中有明确的考虑,您并不打算这样做,但这是您的责任,而不是编译器的责任。