我正在整理一些旧代码,该代码反复执行
在我重构
myString.ToCharArray().Length
; 而不是myString.Length
。在我重构
ToCharArray()
之前,是否存在任何情况下这样做会导致不同的行为?myString.ToCharArray().Length
; 而不是myString.Length
。ToCharArray()
之前,是否存在任何情况下这样做会导致不同的行为?ToCharArray()
方法返回的原始字符串和 char[]
数组都是字符串内容的 UTF-16 表示形式。在这两种情况下,长度都是表示文本所需的 UTF-16 代码点的数量,因此它们将匹配。 - Sam HarwellNullReferenceException
这个提示和任何事情有什么关系?如果字符串是 null
,在这两种情况下都会发生这种情况。 - Grant Thomaschar
)。每个索引位置上都会有一个字符(或数组),然后以下内容可能值得一提:
从这里可以推断出,Length 属性返回此实例中 Char 对象的数量,而不是 Unicode 字符的数量。原因是一个 Unicode 字符可能由多个 Char 表示。使用 System.Globalization.StringInfo 类来处理每个 Unicode 字符,而不是每个 Char。
ToCharArray
也是如此,因为它给出了"一个 Unicode 字符数组,其中的元素是此实例的单个字符"。NullReferenceException
的内容是什么,因为两者也可能受到此影响。会导致不同的行为吗?
好的,像其他人说的一样,在这两种方式中,结果都将是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
方法无论如何都会检查字符串的长度,因此肯定不会有性能提升。 - Grant Thomas我认为在任何情况下它都不会产生不同的结果!
但是,如果我使用它的重载方法,即ToCharArray(int startIndex, int length)
,那么显然它可以根据你提供的长度给出不同的长度属性值。
此外,我无法像ToString()
方法一样在我的自定义类中覆盖ToCharArray()
方法。因此,如果您只想计算长度,则使用myString.Length
比使用myString.ToCharArray().Length
更有意义。