我使用string.Create
方法创建一个新字符串,如下所示:
var rawStr = "raw str";
var newStr = string.Create(rawStr.Length, rawStr,
(chars, str) =>
{
chars = str.ToCharArray();
});
但是,结果newStr只是一个空的字符数组。
我在这里看到了一个答案,并修改了我的代码:
var rawStr = "raw str";
var newStr = string.Create(rawStr.Length, rawStr.ToCharArray(),
(chars, str) =>
{
//chars = str.ToCharArray();
for (int i = 0; i < chars.Length; i++)
{
chars[i] = str[i];
}
});
那么,newStr的值是raw str
,这是为什么呢?
我将尝试解释您在做什么:
字符串.创建文档
创建具有特定长度的新字符串,并在创建后使用指定的回调对其进行初始化。
你可以通过创造实现的,是一种转换。在最简单的形式中,它只需要一个chars
数组并创建为字符串。
让我们分解一下函数:
string.Create<TType>( newStrLength, typedOnject, creationFunction);
TType
- 它是将转换或用于创建新字符串的输入类型(在你的情况下为字符串(
newStrLength
- 您需要提供新的字符串长度
typedOnject
- 将提供给创建函数的TType
类型的对象
creationFunction
- 一个 lamda 函数,它将根据字符和TType
缓冲区执行某些操作。创建正在调用此函数。字符由创建提供,它们是新字符串的字符,可以根据需要进行修改。
在您的情况下,您的创建函数从字符串中逐个获取字符并将它们映射到新字符串,从而有效地创建一个副本。
在第一次尝试时,将发生以下情况:
chars 数组有一个引用,该引用被 ToCharArray 返回的新数组替换。因此,通过此赋值,您不再引用将用于创建字符串的字符。原始数组保持不变。
在第二次尝试中,您将更改原始数组的值,因此新字符串使用它。
这种复杂性是没有必要的。使用以下语法:
var rawStr = "raw str";
var newStr = rawStr;