我正在清理一些反复做myString.ToCharArray().Length
的旧代码;而不是myString.Length
。
在我重构ToCharArray()
之前,是否有任何情况会导致不同的行为?
答案 0 :(得分:8)
没有区别:看看反射器的方法代码:它将根据字符串的长度分配一个char []。
答案 1 :(得分:3)
两者肯定会返回相同的长度,表示字符数(char
s)。每个字符串(或数组)的索引都会有一个字符,然后是以下could be worthy of mention:
Length属性返回此对象中Char对象的数量 实例,而不是Unicode字符的数量。原因是一个 Unicode字符可能由多个Char表示。使用 System.Globalization.StringInfo类用于处理每个Unicode 字符而不是每个字符。
通过此,您还可以推断ToCharArray
,NullReferenceException
,它们的行为相同。
我不确定{{1}}上的内容是什么,因为两者都容易受到影响。
答案 2 :(得分:2)
导致不同的行为?
嗯,正如其他人所说,在两种方式中,结果将是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数组,您可以就地修改它。这有时会提高代码的性能。
答案 3 :(得分:0)
我认为在任何情况下都会给出不同的结果!
但如果我使用其重载方法,即ToCharArray(int startIndex, int length)
那么显然它可以在给出长度时给出不同的长度属性值。
另外,我无法在我的自定义类中覆盖此ToCharArray()
方法,例如ToString()
方法。因此,如果您只想计算长度,那么使用myString.Length
比使用myString.ToCharArray().Length
更有意义。