繰り返し実行している古いコードをクリーンアップしていmyString.ToCharArray().Length
ます; の代わりにmyString.Length
。
リファクタリングする前に、リファクタリングToCharArray()
を行うと異なる動作が発生する状況はありますか?
違いはありません:リフレクター付きのメソッドコードを見てください:文字列の長さに基づいてchar[]を割り当てます。
どちらも間違いなく同じ長さを返し、文字数(char
s)を表します。文字列(または配列)のインデックスごとに1つの文字があり、次のことは言及に値する可能性があります。
Lengthプロパティは、Unicode文字の数ではなく、このインスタンスのCharオブジェクトの数を返します。その理由は、Unicode文字が複数の文字で表される可能性があるためです。System.Globalization.StringInfoクラスを使用して、各Charではなく各Unicode文字を操作します。
ToCharArray
これから、「要素がこのインスタンスの個々の文字であるUnicode文字配列」であるとすると、それらが同じように動作することを推測することもできます。
NullReferenceException
どちらもその影響を受けやすいので、何がオンになっていないのかわかりません。
異なる動作になりますか?
さて、他の人が言ったように、両方の方法で、結果はの数になる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()
、インプレースで変更できます。これにより、コードのパフォーマンスが向上する場合があります。
どのシナリオでも異なる結果になるとは思いません!
しかし、オーバーロードされたメソッドを使用する場合、つまりToCharArray(int startIndex, int length)
、長さを指定すると、明らかに長さプロパティの値が異なる可能性があります。
ToCharArray()
また、メソッドのようなカスタムクラスでこのメソッドをオーバーライドすることはできませんToString()
。したがって、長さのみを計算する場合は、を使用myString.Length
するよりもを使用する方が理にかなっていmyString.ToCharArray().Length
ます。