C# string.Length vs string.ToCharArray().Length
我正在清理一些重复执行的旧代码C# string.Length vs string.ToCharArray().Length,c#,string,C#,String,我正在清理一些重复执行的旧代码myString.tocharray().Length;而不是myString.Length 在我重构ToCharArray()之前,是否存在这样做会导致不同行为的情况?没有区别:查看带有反射器的方法代码:它将根据字符串的长度分配一个char[]。两者肯定会返回相同的长度,表示字符数(chars)。字符串(或数组)的每个索引将有一个char,然后是以下内容: Length属性返回此字段中的字符对象数 实例,而不是Unicode字符数。原因是 Unicode字符可能由
myString.tocharray().Length
;而不是myString.Length
在我重构
ToCharArray()
之前,是否存在这样做会导致不同行为的情况?没有区别:查看带有反射器的方法代码:它将根据字符串的长度分配一个char[]。两者肯定会返回相同的长度,表示字符数(char
s)。字符串(或数组)的每个索引将有一个char,然后是以下内容:
Length属性返回此字段中的字符对象数
实例,而不是Unicode字符数。原因是
Unicode字符可能由多个字符表示。请使用
System.Globalization.StringInfo类来处理每个Unicode
字符而不是每个字符
从这一点,您还可以推断出ToCharArray
,假设它们的行为相同
我不确定not on
NullReferenceException
是关于什么的,因为两者都容易受到影响。我认为在任何情况下都不会产生不同的结果
但是如果我使用它的重载方法,即ToCharArray(int startIndex,int length)
很明显,当你给出长度时,它可以给出不同的长度属性值
此外,我无法在自定义类中重写此tocharray()
方法,如ToString()
方法。因此,如果您只想计算长度,那么使用myString.length
比使用myString.tocharray().length
更有意义
导致不同的行为
正如其他人所说,在这两种情况下,结果都是字符数,所以答案肯定是否定的
但我想给这个答案添加一些不同的东西
当我反编译方法时,它看起来像:
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
代码来操作指针,以及基类库中的私有方法。它通常比在托管代码中执行同样的操作要快,托管代码必须检查数组边界
但是
它完全传递字符串,因此如果不需要,手动填充字符数组可能会更快
因为
ToCharArray()
方法返回一个字符数组,您可以对其进行适当的修改。这有时会提高代码的性能。我认为很难想象每一种可能的情况。我认为这是您必须测试和查看的内容之一。@user1477388我已经查看了一些小情况。如果出现异常,它将出现在真正的“有趣的”unicode行为;而不是正常的日常情况。在整个字符集上迭代以强制执行数十亿个测试字符串将比问这个问题花费更长的时间。@Danneey请看@voo,因为我不会将数据转储到任何看起来不相关的字节。特别是原始字符串和字符[]
由ToCharArray()返回
将是字符串内容的UTF-16表示形式。这两种情况下的长度都是表示文本所需的UTF-16代码点的数量,因此它将匹配。第二种情况下可能会有NullReferenceException toNullReferenceException
注释与任何事情都有什么关系?如果是字符串,这两种情况下都会发生null
。我们不能像ToString()方法那样重写toCharray()方法。我将重写ToString()方法在我的类中添加一些额外的逻辑。我认为这件事的易变性没有问题,而且正如您所看到的,ToCharArray
方法检查字符串的长度,因此肯定不会有性能提升。