我正在清理一些重复执行的旧代码myString.ToCharArray().Length
;而不是myString.Length
.
在我重构之前ToCharArray()
,在任何情况下这样做会导致不同的行为吗?
没有区别:看看带有反射器的方法代码:它将根据字符串的长度分配一个 char[]。
两者肯定会返回相同的长度,代表字符数(char
s)。字符串(或数组)的每个索引都有一个字符,然后,以下内容可能值得一提:
Length 属性返回此实例中 Char 对象的数量,而不是 Unicode 字符的数量。原因是一个 Unicode 字符可能由多个 Char 表示。使用 System.Globalization.StringInfo 类来处理每个 Unicode 字符而不是每个 Char。
从中您还可以推断ToCharArray
,鉴于它是“一个 Unicode 字符数组,其元素是此实例的各个字符”,它们的行为相同。
我不确定 not onNullReferenceException
是关于什么的,因为两者也都容易受到影响。
导致不同的行为?
好吧,正如其他人所说,在这两种方式中,结果都将是 的数量char
,所以,答案肯定是NO!
但我想为这个答案添加一些不同的东西。
当我反编译String.ToCharArray()
方法时,它看起来像:
public unsafe char[] ToCharArray()
{
int length = this.Length;
char[] chArray = new char[length];
if (length > 0)
{
fixed (char* smem = &this.m_firstChar)
fixed (char* dmem = chArray)
string.wstrcpyPtrAligned(dmem, smem, length);
}
return chArray;
}
ToCharArray
使用unsafe
操作指针的代码以及wstrcpyPtrAligned
基类库中的私有方法。它通常比在托管代码中做同样的事情要快,后者必须检查数组边界。
它对字符串进行了完整的传递,因此如果您不需要,手动填充字符数组可能会更快。
由于ToCharArray()
方法返回一个 char 数组,您可以就地修改它。这有时会提高代码的性能。
我认为它在任何情况下都会产生不同的结果!
但是如果我使用它的重载方法ToCharArray(int startIndex, int length)
,那么显然它可以在你给出长度时给出不同的长度属性值。
我也不能ToCharArray()
在我的自定义类中覆盖这个方法,比如ToString()
方法。所以如果你只想计算长度,那么 usingmyString.Length
比 using 更有意义myString.ToCharArray().Length
。