字符串.长度vs . string.ToCharArray().Length

本文关键字:Length ToCharArray string 长度 vs 字符串 | 更新日期: 2023-09-27 18:05:24

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

在我重构ToCharArray()之前,是否存在这样做会导致不同行为的情况?

字符串.长度vs . string.ToCharArray().Length

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

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

Length属性返回数组中Char对象的个数实例,而不是Unicode字符的数量。原因是aUnicode字符可以由多个Char表示。使用stringinfo类来处理每个Unicode

由此你也可以推断出ToCharArray,假设它是"一个Unicode字符数组,其元素是此实例的单个字符",它们的行为相同。

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

导致不同的行为?

,正如其他人所说,在这两种方式下,结果将是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(int startIndex, int length)显然长度属性的值会随着长度的变化而变化

我也不能覆盖这个ToCharArray()方法在我的自定义类像ToString()方法。因此,如果您只想计算长度,那么使用myString.Length比使用myString.ToCharArray().Length更有意义。