2011-12-22 15 views
9

クラスのインスタンスを作成すると、そのインスタンス内のすべての変数はそのインスタンスに固有であり、インスタンスが有効範囲外になると強制終了されます。しかし、それは静的な方法でどのように機能しますか? 2人が正確に同時にSystem.Math.Abs​​()を呼び出すとします。ランタイムは2人の呼び出し元をどのように区別しますか?これはスレッキングが入っている場所ですか?呼び出し元ごとに個別のスレッドが自動的に作成されますか?C#で静的メソッドを呼び出すとどうなりますか?

+1

[this](http://stackoverflow.com/questions/680546/static-function-concurrency-asp-net)はあなたの質問に答えていますか? –

+4

.ToStringは静的メソッドではありません。 –

+0

エマニュエル、あなたが言いました投稿をチェックしました。それは私の心配に対処していますが、それは答えています。( – developer747

答えて

10

メソッド変数の有効期間に関して、静的メソッドと非静的メソッドの間には実質的な違いはありません。どちらの場合も、実装の詳細としてがありますが、ローカルには(一般的には必ずしも例外ではありません)スタックに割り当てられています。スタックはスレッド単位であるため、ローカルメソッド変数はスレッド間でクロスオーバーしません。

ここでインスタンスと静的の間の唯一の違いは、インスタンスメソッドに暗黙の0パラメータ(別名「this」)があり、呼び出し元によってプッシュされます(プラスいくつかの仮想ディスパッチとヌルチェックの楽しみです)。簡単にするために

、私はあなたのクラスのインスタンスを作成すると、インスタンスが外にあるとき、そのインスタンスに固有のすべての変数が殺され

+0

ありがとうございました! – developer747

6

クラスのインスタンスが存在しなくても、クラスのすべての静的メンバーが存在します。最初の使用の前にいつでも初期化され、プログラムが完了するとクリーンアップされます。

静的メソッドを2回同時に呼び出すと、クラスの静的メンバーの同じコピーを使用しています(使用している場合)。したがって、静的メソッドが静的メンバ(またはパラメータ)上で動作する場合、スレッドセーフな方法で静的メソッドを実行する必要があります。静的メソッドがローカルでのみ動作する場合、メソッド自体は通常スレッドセーフです。

ランタイムが2人の呼び出し元を区別する方法については、これがスレッドの本質です。各スレッドには、ローカル変数、パラメータ、戻りアドレスなどの独自のコピーを持つ独自の呼び出しスタックがあります。したがって、2つの呼び出しは混乱することなく、呼び出し元に正しく戻ります。スレッドセーフではないスタティックメンバ(またはスレッドセーフではないパラメータ)に対して静的メソッドが動作しているかどうかが問題です。

+0

良い説明ジェームズ。ありがとう。あなたはちょうど私に言ったことを人々はどうやって知っていますか?このようなファンダメンタルズを扱う素晴らしい本をお勧めしますか? – developer747

+0

CompSciの私の学士号はプログラミング言語理論とプログラミング言語の自己学習のコースです。実際に詳細を知りたい場合は、C#言語仕様を読んで、実装について知っておくべきことをすべて説明します:http: //msdn.microsoft.com/en-us/library/ms228593.aspx –

+0

あなたの学部の書籍の1つ(このような基本を扱う)を推薦しなければならない場合は、それは何ですか? – developer747

12

など反復子ブロック、撮影した変数を、オーバー光沢よ範囲。

変数 - 通常「フィールド」と呼ばれるが、インスタンスの寿命を割り当て解除されます。 スコープは、コンパイラが名前で何かを認識するプログラムテキストの領域です。 リフトは、のの部分であり、その間に格納場所が有効です。スコープと寿命はしばしば混乱します。

しかし、静的メソッドではどのように機能しますか?

スタティックフィールドの有効期間は制限されません。格納場所は、フィールドがアクセスされる前のある時点で作成され、appdomainが解体されるまで破棄されません。

2人がSystem.Math.Abs​​()を正確に同時に呼び出すとします。

OK。それはどうやって提案するのですか?

ランタイムは2人の呼び出し元を区別しますか?これはスレッキングが入っている場所ですか?

静的メソッドは、メモリ内の数値である機械命令の束に組み込まれます。実行の各スレッドは、命令ポインタと呼ばれる現在の命令を特定する番号を有する。 2つの異なるスレッドは、同時に同じ静的メソッド内にある命令ポインタを持つことができます。

発信者ごとに個別のスレッドが自動的に作成されますか。

質問には意味がありません。 2人の発信者が同時に別のスレッドにない場合、どのようにしてを同時に取得しましたか?

関連する問題