問題タブ [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.

0 投票する
1 に答える
1034 参照

.net-4.0 - 派生クラスの c++/cli 静的コンストラクターが呼び出されない

私の別の SO 投稿で説明されているように、VS 2008 (.net 3.5) から VS 2013 (および 4.5 ではなく .net 4.0 を使用) に移行した後、アプリケーションの奇妙な動作を見ました。クラスの静的コンストラクター (cctor) が呼び出されなくなっていることがわかりました。したがって、アプリケーションを小さなテスト プログラムに分割しました。

DLL testAssembly_2-0 および testAssembly_4-0
(同様の内容; testAssembly_4-0 の名前は40ではなく20)

main VS2008
コンパイル時testAssembly_2-0およびmainVS 2008 で (.net 2.0 アセンブリとそのアプリケーションを作成)、両方の実行方法で期待どおりに実行されます (IDE でデバッグ モードを開始し、exe を直接開始します):

main VS2013
VS 2013 で コンパイルtestAssembly_4-0mainて (.net 4.0 アセンブリとアプリケーションを作成)、既存のものを含める ( app.config.net 2.0 testAssembly_2-0を使用、リンクされた投稿を参照) 場合でも動作しますが、IDE のデバッグと exe の開始とでは​​動作が異なります。
IDE のデバッグでは、上記の結果が生成されます ( で 1 回、Class20で 1 回Class40)。
exe start は、cctorクラスのインスタンス化時ではなく、静的メンバーが初めてアクセスされたときに呼び出します。これは、.net 4.0 で導入された、いわゆる遅延初期化が原因であるに違いありません。ここ数時間の調査でわかっている限りです。

拡張された DLL
これはまだ私の失敗を再現していないので、元のアプリケーションでも行っているように、静的メンバーにアクセスするためのプロパティをクラスに追加しました。でこのプロパティをクエリmain()すると、関数呼び出しの順序が異なります (Class20 cctorが最初に呼び出され、 の先頭で直接呼び出されるようになりましたmain())。しかし、その行動は正しかった。

したがって、元のアプリケーションにさらに一歩進み、両方のアセンブリに派生クラスを追加しました。

main VS2008 new
テスト プログラムは、派生クラスのオブジェクトを作成するようになりました。両方の実行方法 (IDE、exe 直接) で期待どおりに実行されます。

main VS2013 new
テスト プログラムは、両方の派生クラスのオブジェクトを作成するようになりました。IDE から起動すると、期待どおりに実行されます (VS2008 new と同じ結果で、Class40 で 1 回、Class20 で 1 回)。
しかし、exe を起動すると、結果が正しくありません。

.net 2.0 アセンブリの派生 cctor() が呼び出されないのはなぜですか?
これは .net 4.0 の遅延初期化の意図した動作ですか、それともコンパイラのバグであると思いますか? ここで奇妙なことに、.net 4.0 アセンブリは正しく使用されていますが、.net 2.0 アセンブリは正しく使用されていません。

また、上部の基本クラス:
.net 4.0 cctor はクラスのインスタンス化で呼び出されるのに、.net2.0 cctor はオンデマンドで呼び出されるのはなぜですか?

編集 1

app.exe.config を使用する場合と使用しない場合で、同じアプリケーション (VS2008、DLL 拡張) が exe として実行されると、動作が異なることがわかりました。
app.config が存在する場合、アプリケーションは VS2013 でコンパイルされたものとして動作します。つまり、アプリケーションに問題があります。

しかし、app.config を削除するとすぐに、アプリケーションは正常に動作します。
したがって、バグはVS C ++ / CLIコンパイラ内ではなく、.net 4.0 CLR自体内にあると思います...

0 投票する
2 に答える
2304 参照

c# - 構造体に対して静的コンストラクターが機能しない

環境: C#6、Visual Studio 2015 CTP 6

次の例を考えます。

}

何らかの理由で静的 ctor が実行されていません。SavingsAccount を構造体ではなくクラスとして宣言すると、問題なく動作します。

0 投票する
3 に答える
999 参照

c# - 一度だけ実行されるクラスに静的コンストラクターを含める必要がありますか?

C# で OOP プログラミングを学び始めています。設計に関しては、プログラムのメイン クラスにコンストラクターを使用することは理にかなっています。staticこのクラスには 1 回だけ実行されるコードが含まれていることを考えると (私のプログラム全体は非常に単純で、単一の .cs ファイルで構成されています)。

たとえば、通常のコンストラクタを使用したサンプル コードは次のとおりです。

これは同じ構造に従いますが、staticコンストラクターを使用しています。これで十分だと思います。statusアクセスも変更されていることに注意してください。


質問:最初のコードの代わりに 2 番目のコードを使用するという私の仮定は正しいですか? または、何か不足していますか?言い換えれば、どちらが好ましいですか(より良いデザインと見なされます)?そして、この場合に問題を引き起こす静的コンストラクターに基本的なものはありますか?

0 投票する
2 に答える
1708 参照

java - JAVAで静的コンストラクターの機能を取得するには?

私は C# とStatic Constructor、C# で見つけた Java を学習しています。これは、静的データを初期化するため、または一度だけ実行する必要がある特定のアクションを実行するために使用されます。最初のインスタンスが作成される前、または静的メンバーが参照される前に、自動的に呼び出されます。

例えば:

私の質問は、JAVA で同じ機能を得るにはどうすればよいかということです。

0 投票する
1 に答える
840 参照

c# - FieldInfo.GetValue(null) が静的コンストラクターで機能しないのはなぜですか

以下のコードを参照してください。独自の型の定義済みのすべての静的読み取り専用インスタンスを自動的に列挙するクラスが必要です (例として TestClass を参照してください。独自の型の 3 つの静的読み取り専用インスタンスを定義しています)。

この自動化が必要なのは、定義された型をループして、 のリストに新しいインスタンスを追加するのを忘れるという変更のリスクを冒したくないからですAll

わかりました、私はそれを機能させました、それはポイントではありません。FillAllしかし、静的コンストラクターから呼び出されたときに機能しないのはなぜですか? DefinedInstancesBase<T>コード内のコメント化された静的コンストラクターを参照してください。FieldInfo.GetValue(null)静的コンストラクターで null を返すことを意味しますが、デバッガーFieldInfo.GetValue(null)は呼び出される前に静的読み取り専用インスタンスの作成に既にヒットしています。

うまくいかない理由がとても気になります。これは設計によるものですか?

0 投票する
1 に答える
377 参照

c# - 静的コンストラクターを使用すると、Visual Studio の IntelliSense が壊れる

Visual Studio の Intellisense に問題があります。構造体で静的コンストラクターを作成するたびにC#、コンストラクターを呼び出そうとすると、Visual Studio の Intellisense が壊れます。デフォルトのコンストラクターでさえ、コンストラクターを見つけることができないようです。なぜ私がこの問題を抱えているのか誰かが知っていますか?

インテリセンスなし

0 投票する
1 に答える
23 参照

c# - 2 つの異なるアプリケーションで一度インスタンスを取得するクラス

プロジェクトの認証用のクラスを作成しました。

私は自分のウェブサイトとモバイルアプリケーションでそれを使用したいのですが、なぜこのクラスには静的コンストラクターがあり、一度インスタンスを取得する必要があるのか​​ 、うまく機能しませんでした。つまり、各アプリケーションのインスタンスを一度取得したいということです。

私はそれを修正する方法を知りたいですか?

0 投票する
1 に答える
517 参照

c# - ConcurrentDictionary への入力中の C# 静的コンストラクターの初期化スレッド セーフ

私は電話していますvar person = PersonDB.pDict["395096"];

このコードがブロックされる理由を誰かに説明してもらえますか:

この部分はブロックしませんが:

正直なところ、後者が現在スレッドセーフであるかどうかさえわかりませんが、少なくとも問題なく動作します。競合状態やデッドロックが発生しないように、PersonDB をスレッド セーフなクラスにする方法を知りたいです。pDict は、pDict の使用時に一度作成する必要があります。静的コンストラクターはこれに対する優れた解決策だと思いましたが、PLINQ クエリの実行停止により、非常に不安になります...