10

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

在我重构之前ToCharArray(),在任何情况下这样做会导致不同的行为吗?

4

4 回答 4

9

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

于 2013-03-22T15:22:25.393 回答
3

两者肯定会返回相同的长度,代表字符数(chars)。字符串(或数组)的每个索引都有一个字符,然后,以下内容可能值得一提

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

从中您还可以推断ToCharArray,鉴于它是“一个 Unicode 字符数组,其元素是此实例的各个字符”,它们的行为相同。

我不确定 not onNullReferenceException是关于什么的,因为两者也都容易受到影响。

于 2013-03-22T15:31:30.780 回答
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 数组,您可以就地修改它。这有时会提高代码的性能。

于 2013-03-22T15:55:19.773 回答
0

我认为它在任何情况下都会产生不同的结果!

但是如果我使用它的重载方法ToCharArray(int startIndex, int length) ,那么显然它可以在你给出长度时给出不同的长度属性值。

我也不能ToCharArray()在我的自定义类中覆盖这个方法,比如ToString()方法。所以如果你只想计算长度,那么 usingmyString.Length比 using 更有意义myString.ToCharArray().Length

于 2013-03-22T15:43:31.167 回答