2

クラスの例:

public class SomeType
{
    private int type;

    // some code...

    public override string ToString ()
    {
       if (type == 1) return "One";
       if (type == 2) return "Two";
    }
}

ここで、アプリケーションが 1ToString()秒間に何千回もメソッドを呼び出すと想像してください。

私の質問は次のとおりです。インラインで作成された文字列をコードで使用するsomething = myClass.ToString()と、すべての呼び出しで新しい文字列が作成されるか、コンパイラが何らかの方法で最適化しますか? (文字列は不変であるため、静的文字列への参照のみが返される可能性があります)。

そうでない場合は、静的なプライベート文字列フィールドを作成しToString、パフォーマンス上の理由からメソッドで返す必要がありますか?

もちろん、ストップウォッチを使用してテストしますが、とにかく専門家の回答が必要です.

4

1 に答える 1

6

文字列リテラルを使用しています。つまり、毎回同じ文字列への参照を返しています。これは、言語仕様によって保証されています。C# 5 仕様のセクション 2.4.4.5 から:

文字列等価演算子 (§7.10.7) に従って等価な文字列リテラルが 2 つ以上同じプログラムにある場合、これらの文字列リテラルは同じ文字列インスタンスを参照します。

より簡単な例として:

string x = "One";
string y = "One";
Console.WriteLine(object.ReferenceEquals(x, y)); // Prints True

コードでは、ToString()メソッドは引き続き呼び出されますが、毎回新しい文字列オブジェクトは作成されません。switchところで、これらすべてのステートメントの代わりにステートメントを使用することを検討してくださいif

毎回新しい文字列を作成したとしても、毎秒数千の文字列を作成しても、最新の CPU が汗をかくほどでないことに注意してください。アロケーターとガベージ コレクターはどちらも非常に効率的で、最新のコンピューターは 1 秒間に非常に多くの作業を実行できます。

于 2013-01-01T20:02:59.193 に答える