C# 清除C中的System.String#

C# 清除C中的System.String#,c#,C#,这会覆盖我的字符串的内容吗: unsafe { fixed (char* chars = str) { for (int i = 0; i < str.Length; i++) chars[i] = '1'; } } 不安全 { 固定(char*chars=str) { 对于(int i=0;i

这会覆盖我的字符串的内容吗:

unsafe
{
    fixed (char* chars = str)
    {
        for (int i = 0; i < str.Length; i++)
            chars[i] = '1';
    }
}
不安全
{
固定(char*chars=str)
{
对于(int i=0;i
背景是我正在使用的,您可以使用普通的
System.String设置密码。如果可能的话,我想事后“澄清”。欢迎对如何执行此操作提出任何建议,但主要问题是了解
fixed
是否真的能让我访问底层的char数组。谢谢

编辑


我想了解这里发生了什么-如果字符串对象是不可变的,并且
固定的
不允许对象移动,那么在发布的代码中发生了什么?正在写入的字符在哪里?

System.String
是不可变的,因此您不能修改它

字符串是不可变的——不能更改字符串对象的内容 创建对象后更改,尽管语法使其 看起来好像你能做到这一点

如果出于安全原因需要删除字符串,请尝试查看

事实上,您的代码改变了字符串,您可以在此处看到Eric Lippert的答案::

您可以创建一个CLR强制其不可变的类型。你 然后可以使用“不安全”关闭CLR强制机制。 这就是为什么“不安全”被称为“不安全”——因为它关闭了 安全系统。在不安全代码中,内存中的每个字节 如果您足够努力,进程可以是可写的,包括 不可变字节和CLR中强制不可变的代码

如果您确实被限制使用不带
SecureString
的C#版本,那么您必须使用不安全的代码。但也许最好的解决办法是更努力地更改版本。

使用。过载的全部原因是为了避免这个问题。您不应该尝试变异
System.String
实例。(反射当然是可能的,但应该避免。)

我想了解这里发生了什么-如果字符串对象是不可变的,并且fixed不允许对象移动,那么在发布的代码中发生了什么?这些字符被写到哪里

只有按照规则玩,字符串才是不可变的。在这里,您实际上是在使用不安全的代码来改变字符串。(甚至可以使用通过
peverify
的意义上的“安全”代码,但以其他方式扭曲规则,例如通过反射或通过调用非公共的
AppendInPlace
方法。)


像那样违反规则是危险的。它可能会干扰你的工作。它可能损坏.NET运行时所依赖的内存位置,例如存在于每个.NET对象开头的TypeHandle和syncblk字节。等等。

好的。那么我发布的代码中发生了什么。。。它不能为每个字符修改创建一个新字符串,对吗。。。因为它是
固定的
@noelicus:发生的事情是你正在写你不应该写的内存,因此你的程序的行为是未定义的。这样的程序可以有任何行为;你正在观察一个特定的行为并不违背这个事实,它证实了这一点。不幸的是,我被限制使用.NET3.5,这是我第一次看到它。@noelicus:如果你在问题中这么说,那就太好了。当有一个明确的好答案不适用于您的情况时,您应该始终解释您已经知道,并且它不适用于您的情况。实际上,我的意思是,我立即在Visual Studio中的NetworkCredentials构造函数中查找重载,但它不在那里,而不是我完全知道!如果我知道我会说出来,别担心!