ここでは1つだけ質問しましたが、質問する必要がある質問が12ほどあるので、すべて答えます。
これが私が想定したシーケンスです
- クラスコンストラクターの開始(別名
cctor
)
- cctorの終わり
- メインの開始
- MyMethodの開始
これは正しいです?
いいえ。正しい順序は次のとおりです。
- プログラムのcctorがあれば、それを開始します。存在しない。
- プログラムのcctorがあれば、それを終了します。存在しない。
- メインの開始
- MyClassのcctorの開始
- MyClassのcctorの終わり
- MyClass.MyMethodの開始
静的フィールド初期化子がある場合はどうなりますか?
CLRは、静的フィールド初期化子が実行される順序を変更できる場合があります。詳細については、この件に関するJonのページを参照してください。
静的コンストラクターと型初期化子の違い
MyMethod
そのクラスのcctorが完了する前に、のような静的メソッドが呼び出される可能性はありますか?
はい。cctor自体がMyMethodを呼び出す場合、明らかに、cctorが完了する前にMyMethodが呼び出されます。
cctorはMyMethodを呼び出しません。MyMethod
MyClassのcctorが完了する前に、のような静的メソッドが呼び出される可能性はありますか?
はい。cctorがMyMethodを呼び出す別のタイプをcctorが使用する場合、MyClasscctorが完了する前にMyMethodが呼び出されます。
直接または間接的に、MyMethodを呼び出すcctorはありません。MyMethod
MyClassのcctorが完了する前に、のような静的メソッドを呼び出すことは可能ですか?
番号。
複数のスレッドが関係している場合でも、それはまだ本当ですか?
はい。cctorは、静的メソッドを任意のスレッドで呼び出す前に、1つのスレッドで終了します。
cctorを複数回呼び出すことはできますか?2つのスレッドの両方がcctorを実行するとします。
関係するスレッドの数に関係なく、cctorは最大で1回呼び出されることが保証されています。2つのスレッドがMyMethodを「同時に」呼び出すと、それらは競合します。そのうちの1人はレースに負け、MyClasscctorが勝利スレッドで完了するまでブロックします。
cctorが完了するまで、失われたスレッドはブロックされますか?本当に?
本当に。
では、勝ったスレッドのcctorが、負けたスレッドが以前に取得したロックをブロックするコードを呼び出した場合はどうなるでしょうか。
次に、古典的なロック順序の反転条件があります。プログラムがデッドロックします。永遠に。
それは危険なようです。どうすればデッドロックを回避できますか?
あなたがそれをするときにそれが痛いなら、それからそれをやめなさい。cctorでブロックできるようなことは絶対にしないでください。
複雑なセキュリティ要件を適用するためにcctor初期化セマンティクスに依存することは良い考えですか?そして、ユーザーとの対話を行うcctorを用意するのは良い考えですか?
どちらも良い考えではありません。私のアドバイスは、メソッドのセキュリティに影響を与える前提条件が満たされていることを確認するための別の方法を見つける必要があるということです。