1

インスタンス化されたクラス内でメソッドを使用するのではなく、メソッドを静的に定義して使用する場合、メモリまたはパフォーマンスに違いはありますか? メソッドが静的でない場合、メソッド自体はクラスの各インスタンスでメモリを占有しますか?

おそらく、静的メソッドで宣言された変数はスレッドセーフではありませんか?

/// <summary>
/// A class using instance methods (non-static)
/// </summary>
public class Junk
{
    public int x {get; protected set;}
    public Junk(int x = 0)
    {
        this.x = x;
    }
    public void Increment()
    {
        this.x++;
    }
}

/// <summary>
/// A class using static methods
/// </summary>
public class Junk
{
    public int x {get; protected set;}
    public Junk(int x = 0)
    {
        this.x = x;
    }
    public static void Increment(Junk thisJunk)
    {
        thisJunk.x++;
    }
}
4

4 に答える 4

7

違いはありません。例が示すように、インスタンス メソッドは論理的には、最初のパラメーターの名前が「this」である静的メソッドにすぎません。唯一の違いは、"this" がインスタンス メソッドで null かどうか自動的にチェックされることです。静的メソッドではありません。

現在、実際に呼び出されるメソッドはコンパイル時ではなく実行時に計算する必要があるため、仮想メソッドによってパフォーマンス コストが発生します。これにより、プログラムの実行時間が最大で数ナノ秒長くなる可能性があり、インライン化などの特定の最適化も妨げられます。

スレッド セーフに関しては、変数が安全に使用されるかどうかはプログラム全体のプロパティであり、メソッドが静的かどうかのプロパティではありません。

于 2013-04-15T16:48:05.620 に答える
2

いいえ; インスタンス メソッドは、インスタンスごとにスペースを占有しません。仮想メソッドでさえそうはしません。すべてのインスタンスで使用されるメソッド テーブルは 1 つだけです。

とはいえ、非常に小さなパフォーマンスの違いがあります。インスタンス メソッドはthis参照を非表示のパラメーターとして受け取り、呼び出しサイトは null 参照をチェックする必要がある場合があります。これにより、メソッドの呼び出しが少し高くなりますが、違いはほとんど問題になりません。

あなたの例では、JITコンパイラがメソッドをインライン化し(静的であるかどうかにかかわらず)、いずれかの方法で同一のコードを生成すると非常に思われます。

于 2013-04-15T16:47:47.180 に答える
1

静的メソッドで宣言された変数は、明らかに静的ではありません。例http://blogs.msdn.com/b/csharpfaq/archive/2004/05/11/why-doesn-tc-support-static-method-variables.aspxを参照してください。

最近の FAQ は次のとおりです: http://msdn.microsoft.com/en-us/library/79b3xss3.aspx : 「C# は静的ローカル変数 (メソッド スコープで宣言された変数) をサポートしていません。」

于 2013-04-15T17:17:11.493 に答える