この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 31028|答える: 1

[出典] .ctorおよび.cctor of .netの

[リンクをコピー]
掲載地 2017/04/06 14:56:38 | | | |
.ctorは誰にでも知られている

.cctorは馴染みがなく、簡単に誤用される可能性があります

いわゆる.cctorはC#構文における静的コンストラクタです

形は




.cctorと.ctorの類似点と相違点

   1. アクセス権識別子を公開・非公開などにしては使えず、.ctorとは異なる

   2. 戻り値があってはなりません。これは.ctorと同じです

   3. パラメータが存在しない場合、.ctor は複数のパラメータを持つことができます

   4. 最大でも1つしか存在できず、少なくとも1つの.ctorが存在しなければならない

   5. プログラマは.cctor呼び出しのタイミングを制御できません。ある意味で、プログラマは呼び出しのタイミングを制御できます

   6. プログラマーは.cctor、.ctorを直接呼び出すことはできません。プログラマが新しい演算子を使うと、必ず.ctorが呼ばれます


.cctorの通話タイミング:


    静的コンストラクタは、最初のインスタンスが作成される前や静的メンバーを参照される前に自動的に呼び出されます。 (これはMSDNの元の引用です)

    .cctorは.ctorのようにオブジェクトがインスタンス化されるたびに呼び出すのではなく、同じプログラムドメイン内で一度だけ呼び出されることは明らかです

.cctorの使用

    静的コンストラクタは、静的データの初期化や、一度だけ実行すればよい特定の操作を実行するために使用されます。


例えば:

以下のコードはすべてWindows 7でコンパイルされており、2005リリースモードとは異なる場合は、リリースモードに切り替えて再挑戦を検討してください




このコードセグメントをコンパイルし、ILDISMで表示します。メソッドテーブルは以下の通りです



.ctor(): void // これはコンパイラによって自動的に提供されるクラスのインスタンス構造体です

Main():void(string[]) //プログラムエントリポイント

明らかに、アセンブリには.cctorは存在せず、クラスに初期化が必要な静的フィールドがない場合、コンパイラは自動的に.cctor関数を提供しません。これは.ctorとは違います。.ctorは常に存在します

コードを修正してください




このコードをコンパイルする際に警告は出ますが、それは重要ではなく、重要なのはILDASTOMでアセンブリを見ると、期待される.cctorの静的コンストラクタが表示されないことです!


どうされました。

その推論は間違っているのでしょうか? CCTORはクラスの初期化に使われる静的フィールドではないのですか?

落ち着いて、コードを見てください





このコードと前のコードの違いは、静的フィールドiの初期値が変わり、次に魔法の瞬間を目撃することです

DASMでやってみましょう。そして驚いたことに、長々とリクエストされていた.cctorがついに登場しました!



.cctorの実装コードを見ると、以下の内容がわかります:

.メソッド private hidebysig specialname rt specialname static
        void .cctor() cil managed
{
  コードサイズ7(0x7)
  .maxstack 8
  IL_0000: ldc.i4.1 // 静的フィールドをインスタンス化してください :-)
  IL_0001:stsfld int32 only_lonely。 A::i
  IL_0006:退役
} // メソッドA::.cctor終了


なぜそうなのでしょうか? その理由としては、Int32型のデフォルト値が0であり、コンパイラがこれを検出して.cctorコードが生成されないように最適化されている可能性があります

参考
https://msdn.microsoft.com/zh-cn/library/k9x6w0hc(VS.80).aspx

最後に、特別な機能要件を実装するために自ら.cctor関数を実装することも可能です

概要
1、. ctorは作り方であり、
2、. cctorは型の初期化器であり、C#の静的コンストラクタです。
3. クラスCがインスタンス化されると、宣言時に割り当てられたフィールドにまず値を割り当て、ベースクラスのコンストラクタを呼び出し、同じ方法で最上位のSystem.Objectまで構成し、その後Cの明示的な構築メソッドでコードを実行します。これは再帰的なプロセスです。





先の:汎用コンテキストバウンドオブジェクト:ContextBoundObjectおよび汎用クラスはサポートされていません
次に:クラスにおける静的、非静的、構成的メソッドの実行順序の概要
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com