string.Length vs string.ToCharArray()。长度

时间:2013-03-22 15:20:24

标签: c# string

我正在清理一些反复做myString.ToCharArray().Length的旧代码;而不是myString.Length

在我重构ToCharArray()之前,是否有任何情况会导致不同的行为?

4 个答案:

答案 0 :(得分:8)

没有区别:看看反射器的方法代码:它将根据字符串的长度分配一个char []。

答案 1 :(得分:3)

两者肯定会返回相同的长度,表示字符数(char s)。每个字符串(或数组)的索引都会有一个字符,然后是以下could be worthy of mention

  

Length属性返回此对象中Char对象的数量   实例,而不是Unicode字符的数量。原因是一个   Unicode字符可能由多个Char表示。使用   System.Globalization.StringInfo类用于处理每个Unicode   字符而不是每个字符。

通过此,您还可以推断ToCharArrayNullReferenceException,它们的行为相同。

我不确定{{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更有意义。