問題タブ [static-constructor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 静的コンストラクターをトリガーする方法
コード:
.NET のジェネリックのおかげで、ジェネリック基本クラスで定義されたジェネリック静的メソッドを再利用して、一連の特定のクラスを作成できます。継承ポリモーフィズムをある程度模倣できます。しかし、異なるバージョンの静的フィールドを初期化するには、静的コンストラクターを使用する必要があります。残念ながら、それらを直接呼び出すことはできないため、その呼び出しをトリガーする方法を見つけ出す必要があります。上記の例は方法を示しています。しかし、インスタンス化やリフレクションのアプローチは好きではありません。また、ジェネリック パラメーターの静的メソッドに制約を作成することもできません。それで、この種の仕事をする別の方法があれば、私は尋ねたいです!
よろしくお願いします!
~~~~~~~~~~~~~~~~
いくつかの結論(少し早いかもしれません):
この種の状況に対処するための回避策はないようです。サブクラスをインスタンス化するか、リフレクションを使用する必要があります。.cctors を一度だけ呼び出す必要があることを考えると、パラメーターなしの ctor をユーザーに公開しないように、 new() 制約を選択できない場合があるため、リフレクション アプローチを支持します。
さらに実験を行った後、.cctors は複数回呼び出される可能性がありますが、最初の呼び出しのみが静的フィールドの設定に影響することがわかりました。それは奇妙ですが、良い奇妙さです!
c# - C#では、静的コンストラクターはオブジェクトの初期化ごとに実行されますか、それとも一度だけ実行されますか?
私のクラスには、多数のアイテムを含む文字列オブジェクトの静的辞書があります(ファイルから読み取り、それらを初期化します)そのために静的コンストラクターを作成しましたが、数秒かかりますが、一度実行したい私はASP.Netでそれをやっているので、より速くするために、私のウェブサイトにこのオーバーヘッドがないようにしたいのですが、どうすればよいですか? このコンストラクターがオブジェクトごとに実行される場合、代わりに何らかの方法を考えていましたが、ユーザーが実行するWebサイトの各ページでこのメソッドを実行する必要があると思うので、同じだと思いますよね? 変数の大きなセットを一度だけ初期化するための解決策は何ですか? ありがとう
c# - 静的コンストラクターは静的メソッドへのアクセスのパフォーマンスを低下させることができますか?
静的コンストラクターは、静的メンバーに初めてアクセスしたときに実行されます。これを知って、私はいくつかの質問があります:
- これは、静的メソッドにアクセスするたびに、ランタイムが静的コンストラクターが呼び出されたかどうかを確認する必要があることを意味しますか?
- これによりパフォーマンスが低下しますか?
- 「コンストラクターレス」静的クラスは、このパフォーマンスへの影響を回避しますか?
[編集]:私はマイクロ最適化には関心がないことを明確にしたいと思います。これは設計上の決定
であるため、私はこの質問をしています。静的コンストラクターでパフォーマンスが低下した場合は、それを念頭に置いてコードを設計し、パフォーマンスに影響を与える可能性のある決定をよりよく認識します。
これが私の質問を説明するための例です。Independent
メソッドを取得して別の静的クラスに入れることの利点はありますか?そうすれば、staticTest
が初期化されているかどうかを確認する必要がなくなります。[更新より良い、より簡単な例については、以下の私の答えを参照してください]。
静的コンストラクターに関するC#仕様からの引用は次のとおりです。
静的コンストラクターの実行は、アプリケーションドメイン内で発生する次のイベントの最初のものによってトリガーされます。
- クラスのインスタンスが作成されます。
- クラスの静的メンバーのいずれかが参照されます。
java - 静的メソッドのクラスのコンストラクター
クラス内に保持されているマップで実行できる静的メソッドのクラスがあり、クラスが呼び出されたときにマップをセットアップしたいと考えています。プライベート コンストラクターを使用してみましたが、呼び出されていません。私のコードの関連部分は次のとおりです。
ここでプライベートコンストラクターを使用するのは正しいことですか?もしそうなら、私は何を間違っていますか?
これが重複している場合は申し訳ありません。回答を検索してみましたが、何を検索すればよいかわかりません。
java - Javaの静的コンストラクタに引数を渡しますか?
引数を使用して静的クラスを初期化し、そのクラスでさらに静的コードを実行しようとしています。
私はstatic
ブロックを認識していますが、引数を取ることはできないようです。
静的コンストラクターに引数を渡す方法はありますか?
そうでない場合、引数を使用して静的クラスを初期化するための推奨される手法は何ですか?
編集: 私の理解では、静的クラスはインスタンス化できないクラスです(Javaに別の用語がある場合、C#では静的クラスと呼ばれます。認識していないことをお詫びします)-それはむしろクラス名を介してアクセスされますオブジェクト名よりも。
私が達成しようとしている (非常に単純化された) のは、辞書を文字列として受け取り、それを解析し、メソッドで .xml のように操作するクラスGetRandomEntry
です。
これが私のコードの詳細なスニペットです:
コード スニペットの関連部分を取得することは決して簡単ではありません。賢明に選択したことを願っています (:
関連する可能性のある別の詳細 - 私は通常 ac# プログラマーです。最近 Java の学習を始めたばかりです。
ありがとう。
c# - 静的.ctorsを入力する順序が、継承されたクラスのインスタンス.ctorsと異なるのはなぜですか?
なぜvar b = new B()
最初にstatic B()
.ctorを入力し、インスタンスコンストラクターが(およびthan )するように、その逆ではないのですか?static A()
.ctor
public A()
public B()
c# - VS2010は、静的コンストラクター例外でデバッグを中断しませんでした
Editor
単一のクラス(から継承する)を持つWindowsフォームアプリケーションがありますForm
。
デザイナーが生成したコードを除いて、これはフォームの唯一のコードです(1つのコンボボックス()のみが含まれていますcmbConnections
)。
このConnectionManager
クラスは、静的コンストラクターを持つ静的クラスです。コンストラクターは初期化を行い、重大な状態をテストします。条件が満たされた場合、コンストラクターは例外をスローします。ただし、この例外はVisual Studio 2010のデバッグモードでは発生しません。これをテストするためthrow new Exception()
に、ConnectionManager
の静的コンストラクターのみを配置しました。が使用されるため、イベントハンドラーConnectionManager
で(初めて)初期化されます。Editor_Load
静的コンストラクターが呼び出され、例外がスローされます(出力ウィンドウにのみ表示されます)。残りのEditor_Load
イベントハンドラー(cmbConnections.Visible = false;
)は、期待どおりに実行されません。
しかし、私が理解していないのは、なぜ私のVS2010が例外を飲み込んだのかということです。デバッグは中断されませんでした。try/catchブロックで囲まれていません。メインウィンドウでプログラム実行を続けました。まるでEditor_Load
別のスレッドで実行されたかのようです。
出力ウィンドウにメッセージが表示されます。
Editor.exeで「System.InvalidOperationException」タイプの最初のチャンスの例外が発生しました
Editor.exeでタイプ'System.TypeInitializationException'の最初のチャンスの例外が発生しました
しかし、デバッグモードでは実行が中断されませんでした。
この動作に影響を与える可能性があると私が信じているオプションのいくつかを次に示します。
プロジェクトのプロパティ->ビルド->一般->コードの最適化はチェックされていません。
[ツール]->[オプション]->[デバッグ]->[一般]->[自分のコードだけを有効にする]がオンになっています。
例外設定では、「user-unhandled」のチェックボックスがチェックされています。
私は何かが足りないのですか?この動作は正常ですか?VS2010は未処理の例外をスローすると思いました。そして、ここではこれは処理されておらず、まだ壊れていません。
c# - C# は静的コンストラクターをいつ実行するかをどのように認識しますか?
生成されたコードが、静的メンバー (関数を含む) にアクセスするたびにクラスが初期化されているかどうかをチェックするとは思わない。すべてのアクセスをチェックするのは非効率的だと思います。ECMA 334 の §17.11 を見たところ、
静的コンストラクターの実行は、アプリケーション ドメイン内で次のイベントの最初の発生によってトリガーされます。
- クラスのインスタンスが作成されます。
- クラスの静的メンバーのいずれかが参照されています。
「最初」がいつ発生するかを把握する方法が定義されていないようです。毎回チェックする以外に方法が思いつきません。どのようにすればよいでしょうか?
c# - 静的コンストラクターはどのように機能しますか?
これが私が仮定したシーケンスです
- 静的コンストラクターの開始
- 静的コンストラクターの終了
- メインの開始
- マイメソッドの始まり
- メインの終わり
4が2の前に開始される場合、どのシナリオでも、私はめちゃくちゃです。出来ますか?
wcf - すべての呼び出しで呼び出されるWCFサービスクラスの静的コンストラクター
次のようにコントラクトを実装するサービスクラスがあります。
私が仕上げているのは、Foo APIが呼び出されるたびに、静的コンストラクターが呼び出されるということです。したがって、ログは次のようになります-
Fooと呼ばれる静的コンストラクターと呼ばれるFooと呼ばれる静的 コンストラク
ター
これは静的コンストラクターであるため、これは発生しないはずです。何がうまくいかない可能性があるか考えていますか?
助けてくれてありがとう