C# 更改C字符串中某个索引处的字符的默认方法是什么?

C# 更改C字符串中某个索引处的字符的默认方法是什么?,c#,string,C#,String,我有一个字符串,比如: string s = "abc"; 我想把第二个字符改为“d”,这样它就变成了adc 我认为这会奏效: s[1] = 'd'; 但是,我得到一个错误: Property or indexer 'string.this[int] 'cannot be assigned to -- it is read only 如何在不使用相当复杂的子字符串方法的情况下完成这项简单的任务?字符串是不可替换的。可以使用StringBuilder修改字符串: var s = "abc";

我有一个字符串,比如:

string s = "abc";
我想把第二个字符改为“d”,这样它就变成了adc 我认为这会奏效:

s[1] = 'd';
但是,我得到一个错误:

Property or indexer 'string.this[int] 'cannot be assigned to -- it is read only
如何在不使用相当复杂的子字符串方法的情况下完成这项简单的任务?

字符串是不可替换的。可以使用StringBuilder修改字符串:

var s = "abc";
var sb = new StringBuilder(s);
sb[1] = 'd';
s = sb.ToString();
错误消息是明确的,是只读的。你不可能忘记它

这里是如何定义的

public char this[
    int index
] { get; }
如您所见,没有set访问器

您可以为此使用和方法。这里有一个例子

记住,字符串是。你不能改变它们。创建后无法对其进行修改。即使您认为您更改了它们,您实际上也创建了新的字符串对象

作为替代方案,您可以使用表示可变字符串的类,因为它具有get和set访问器

var sb = new StringBuilder("abc");
sb[1] = 'd';
sb.Dump();  // adc

字符串是不可变的。不能更改字符串,只能创建一个新字符串。要修改这样的字符串,应使用StringBuilder。

不建议这样做,但可以使用不安全上下文:

您可以使用可枚举。选择:


之所以不能只更改一个字符,而需要更复杂的方法,是因为字符串是不可变的——无法修改一个字符的实例,相反,它们的所有助手方法都返回新的、稍加修改的字符串。这至少可以避免您在找出字符串的一个实例发生更改的原因时可能出现的混淆。可能的重复项和您签出的另一个实例:@Katana314。。。是的,我已经预料到了这个原因,但是我有一个从基类返回的字符串,并且在极少数情况下我必须更改一个字符。我宁愿选择一个简洁的解决方案,仍然加1,因为它是一个有效的答案。当然!这个答案仅供参考。谢谢,用10秒打败我:
var sb = new StringBuilder("abc");
sb[1] = 'd';
sb.Dump();  // adc
fixed (char* pfixed = s)
    pfixed[1] = 'd';
string s = "abc";
string n = new string(s.Select((c, index) => 
            {
                if (index == 1)
                    return 'd';
                else
                    return c;
            }).ToArray());
Console.WriteLine(n);  // adc