.NET Core 2.1 字符串.创造



我使用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;

最新更新