問題タブ [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# - Assembly.GetCallingAssembly() と静的コンストラクター?
わかりましたので、眉をひそめた次の問題に遭遇しました。
さまざまな理由から、TestingAssembly.dll の Testing クラスが BaseTestingAssembly.dll の TestingBase クラスに依存するテスト セットアップがあります。その間に TestBase が行うことの 1 つは、それ自体と呼び出し元のアセンブリで特定の埋め込みリソースを探すことです。
したがって、私の BaseTestingAssembly には次の行が含まれていました...
私が考えたので、これらのアセンブリはアプリケーションの存続期間中同じであるため、すべてのテストでそれらを再計算する必要はありません。
ただし、これを実行すると、_assembly と _calling_assembly の両方がそれぞれ BaseTestingAssembly と TestingAssembly ではなく BaseTestingAssembly に設定されていることに気付きました。
変数を非静的に設定し、通常のコンストラクターで初期化するとこれが修正されましたが、なぜこれが始まったのか混乱しています。静的コンストラクターは、静的メンバーが初めて参照されたときに実行されると思いました。これは、呼び出し元である必要がある私の TestingAssembly からのみ可能でした。何が起こったのか知っている人はいますか?
objective-c - クラスロード時のObjective-Cの静的初期化子
Java の Class.forName メソッドの動作と同様に、クラス名からオブジェクトを動的にインスタンス化する何かを構築しようとしています。
Objective-C ではそのような動作は見られなかったので、Objective-C クラスがロードされたときに Class を登録するメソッドを呼び出したいと思います。基本的に、クラスを登録するメソッドを呼び出したいと思います。
OS X プラットフォームの Objective-C でこれを行う方法はありますか?
ありがとう。
c++ - C ++の静的コンストラクター?プライベート静的オブジェクトを初期化する必要があります
プライベート静的データメンバー(すべての文字azを含むベクトル)を持つクラスが必要です。JavaまたはC#では、クラスのインスタンスを作成する前に実行される「静的コンストラクター」を作成し、クラスの静的データメンバーを設定できます。これは1回だけ実行され(変数は読み取り専用であり、一度だけ設定する必要があるため)、クラスの関数であるため、プライベートメンバーにアクセスできます。ベクトルが初期化されているかどうかを確認するコードをコンストラクターに追加し、初期化されていない場合は初期化することもできますが、必要なチェックが多数発生し、問題の最適な解決策とは思えません。
変数は読み取り専用になるので、public static constにすることができるので、クラスの外で一度設定できますが、もう一度、醜いハックのように思えます。
インスタンスコンストラクターでプライベート静的データメンバーを初期化したくない場合、クラスにプライベート静的データメンバーを含めることは可能ですか?
c# - タイプ初期化子(静的コンストラクター)の例外処理
C#でWCFサービスを作成しています。当初、私の実装には1回限りの初期化を行う静的コンストラクターがありましたが、実行中の初期化の一部が(一時的に)失敗する可能性があります。
最初の(失敗した)試行で例外がスローされた場合でも、静的コンストラクターは1回だけ呼び出されるようです。その後、クラスをインスタンス化しようとするとTypeInitializationException
、コードが実際に実行されずにすぐに失敗します。
C#言語仕様では、静的コンストラクターは最大で1回呼び出されると規定されていますが、基本的にこれは例外となり、たとえキャッチしても回復できないエラーが発生しますか?
ここで何かが足りませんか?リモートで危険なものをサービスのインスタンスコンストラクターに移動し、クラスの初期化が以前に正常に完了したかどうかを手動で確認する必要があると思いますか?
c# - 基本クラスの静的読み取り専用フィールドへの割り当て
上記のC#コードのコンパイル中にエラーが発生します。
エラーには、「静的読み取り専用フィールドを割り当てることはできません(静的コンストラクターまたは変数初期化子を除く)」と表示されます。
しかし、私はそれを静的コンストラクターで割り当てています。
このような静的変数の必要性は、基本クラスにはこの変数を使用するメソッドがありますが、派生クラスと基本クラスにはこの変数の異なる値が必要です。ただし、値はそれぞれのクラスのすべてのインスタンスで一定です。どこからでも変更してはならないため、読み取り専用にする必要があります。
上記のコードのエラーは何ですか?(もしあれば)見つけられないようです。エラーメッセージは役に立ちません。私はそれに従って何も悪いことをしていないので。
エラーが発生した場合、どうすればこの機能を実装できますか?簡単な回避策は、インスタンス変数にして、派生クラスで異なる値を割り当てることです。ただし、値はそれぞれのクラスのすべてのインスタンスで一定であるため、これは不要です。
c# - 静的コンストラクターの使用(Jon Skeet Brainteaser)
比較的初心者として、私は特定の主題についてできるだけ多くのことを読み、できるだけ多くのコードをテスト/作成しようとしています。私はJonsBrainteasersの1つ(質問#2)を見ていましたが、私の出力は答えとは異なりました。これにより、最近のバージョンで何かが変更されたかどうかを確認し、他の人がこのコードからどのような出力を取得しているかを確認することができます。
問題は、「何が表示されるのか、なぜ、そしてどの程度自信があるのか」です。
どちらかといえば、2つの異なる答えが得られる原因は何でしょうか。
c# - 静的コンストラクターが呼び出されるタイミングを制御する
カスタム属性の静的コンストラクターで、ロードされたアセンブリから属性で装飾されたすべてのクラスを検索し、それらに対して何らかのアクションを実行します。
静的コンストラクターは、実行時にできるだけ早く、できればstatic void Main()
エントリ ポイントの実行前に呼び出されるようにしたいと考えています。
現在、属性を呼び出した後にのみ呼び出されます。プログラムの他の場所でそのような呼び出しを行うこともできますが、理想的には、属性の機能は自己完結型です。
答えを探して、MSDNでこれを読みました:
ユーザーは、静的コンストラクターがプログラムで実行されるタイミングを制御できません。
しかし、確実に、静的コンストラクターを ASAP と呼ぶには、トリッキーで、狡猾で、いたずらな回避策があります。おそらく、属性、反射、またはその他の種類の魔法を使用できます。それはできますか?
人々は間違いなく、私が要求したことを行う正当な理由はないと言うので、目的とコードを示します。属性を使用して、db4oファクトリを宣言的に構成しようとしています。接続を確立した後で属性の静的コンストラクターが呼び出された場合、それは効果がなく、役に立ちません。したがって、私のプログラムがそのような接続を確立する機会を得る前に、それを呼び出す必要があります。
アップデート:
静的メソッドで抽象属性を使用することになりました。このようにして、好きなだけ属性を派生させることができ、この 1 つのメソッドを呼び出すことで、指定された構成にすべての属性が適用されます。
そして呼び出しサイト:
wcf - シングルトン ChannelFactory の作成クライアント接続での再利用
私たちの SharePoint/ASP.NET 環境には、すべて共通のインターフェイスから派生した一連のデータ取得クラスがあります。私は、WCF を使用して他の SharePoint ファームとリモートで通信できるデータ リトリーバーを作成するタスクを割り当てられました。私が現在実装している方法は、シングルトンChannelFactory<T>
が静的コンストラクターで作成され、リモート データ リトリーバーの各インスタンスによって再利用されて、個々のプロキシ インスタンスが作成されるというものです。ChannelFactory
はアプリ ドメインで 1 回だけインスタンス化され、その作成はスレッド セーフであることが保証されているため、これはうまく機能すると考えました。私のコードは次のようになります。
私の質問は、これは良いデザインですか?ChannelFactory
が作成されたら、単に呼び出すために使用しているだけなので、スレッドセーフについて心配する必要はないと考えましたが、CreateChannel()
間違っていますか? スレッド化の問題を引き起こす可能性のある舞台裏で状態を変更したり、ファンキーなことを行ったりしていませんか? さらに、手動で破棄するコードをどこかに配置する必要がありますか (静的ファイナライザー?)、ChannelFactory
または IIS が再起動されるたびにすべてのクリーンアップ作業が行われると想定できますか?
.net - WCFサービスの静的コンストラクターからインスタンスメソッドを呼び出すことは可能ですか?
WCFサービスの静的コンストラクターからインスタンスメソッドを呼び出すことは可能ですか?MyServiceの現在のインスタンスを取得できる現在のコンテキストのようなものはありますか?
編集:
この質問はWCFの質問であり、静的メソッドからインスタンスメソッドを呼び出すことに関する単純な言語の質問ではありません。Webアプリケーションでの同様のケースの例を次に示します。
したがって、WCFでは、サービスの呼び出し中に、現在実行中のMyServiceのインスタンスを持つグローバルコンテキストが存在することを期待しています。
c# - Java静的ブロックはC#静的コンストラクターと同等ですか?
C# 静的コンストラクターと Java 静的ブロックの実際の違いは何ですか?
どちらもパラメーターなしでなければなりません。どちらも、関連するクラスが最初に使用されるときに一度だけ呼び出されます。
何かが足りないのですか、それとも名前が違うだけで同じものですか?