在C#中string类的索引器是只读的,只能通过索引器去访问string中指定位置上的字符,而不能通过它来改写指定位置上的字符。

这里介绍一种方法直接改写string中的字符,而不是通过string类提供的方法。这里需要用到fixed语句,关于fixed关键字的说明和使用可以参考msdn fixed 语句。在了解了fixed关键字的作用之后,我们可以继续进行下面的代码了

static void Main(string[] args)
        {
            string str = "Hello world";
            unsafe
            {
                fixed (char* p = str)
                {
                    p[2] = 'k';
                    Console.WriteLine(str);
                }
            }
        }
 

编译运行这段代码时需要启用“Allow unsafe code”编译选项,编译后运行.exe文件会输出下面的字符串:这个选项的修改地方在VS中右键项目,属性里 就可以找到。

"Heklo world"

https://blog.csdn.net/feellow/article/details/4646367

原理与风险提示

fixed 语句把托管字符串的内存临时钉住,跳过 GC 检查直接改字符,性能最优但坑也最隐蔽。

  • 字符串驻留(interning):程序里的字面量字符串会被运行时共享,直接改它可能影响所有引用同一字面量的代码,这是真实存在的"魔法故障"来源;
  • 安全建议:只对运行时构造的字符串(如 new string 或 StringBuilder 产物)做 fixed 改写,绝不改字面量;
  • 改完立即退出 fixed 块,钉住时间越短越好;
  • 项目需开"允许不安全代码",unsafe 代码绕过 CLR 安全边界,评审时应当重点关照;
  • 常规场景用 StringBuilder 或 ToCharArray 改完再 new string,性能差异多数时候可忽略。