10

繰り返し実行している古いコードをクリーンアップしていmyString.ToCharArray().Lengthます; の代わりにmyString.Length

リファクタリングする前に、リファクタリングToCharArray()を行うと異なる動作が発生する状況はありますか?

4

4 に答える 4

9

違いはありません:リフレクター付きのメソッドコードを見てください:文字列の長さに基づいてchar[]を割り当てます。

于 2013-03-22T15:22:25.393 に答える
3

どちらも間違いなく同じ長さを返し、文字数(chars)を表します。文字列(または配列)のインデックスごとに1つの文字があり、次のことは言及に値する可能性があります

Lengthプロパティは、Unicode文字の数ではなく、このインスタンスのCharオブジェクトの数を返します。その理由は、Unicode文字が複数の文字で表される可能性があるためです。System.Globalization.StringInfoクラスを使用して、各Charではなく各Unicode文字を操作します。

ToCharArrayこれから、「要素がこのインスタンスの個々の文字であるUnicode文字配列」であるとすると、それらが同じように動作することを推測することもできます。

NullReferenceExceptionどちらもその影響を受けやすいので、何がオンになっていないのかわかりません。

于 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通常、配列の境界をチェックする必要があるマネージコードで同じことを行うよりも高速です。

だが

文字列を完全に通過するため、必要がない場合は、文字配列を手動で入力する方が高速な場合があります

メソッドはchar配列を返すためToCharArray()、インプレースで変更できます。これにより、コードのパフォーマンスが向上する場合があります。

于 2013-03-22T15:55:19.773 に答える
0

どのシナリオでも異なる結果になるとは思いません!

しかし、オーバーロードされたメソッドを使用する場合、つまりToCharArray(int startIndex, int length) 、長さを指定すると、明らかに長さプロパティの値が異なる可能性があります。

ToCharArray()また、メソッドのようなカスタムクラスでこのメソッドをオーバーライドすることはできませんToString()。したがって、長さのみを計算する場合は、を使用myString.Lengthするよりもを使用する方が理にかなっていmyString.ToCharArray().Lengthます。

于 2013-03-22T15:43:31.167 に答える