「.Netでの質問」への回答

POSTの投稿で、.NETとclrについていくつか質問をし、それらに答えることを約束しました。 私は答えます:



1)型インスタンスの作成時にコンストラクターが呼び出されない場合

私は2つのケースを知っています:オブジェクトをデシリアライズするときと、オブジェクトのMemberwiseCloneメソッドを使用してオブジェクトをコピーするとき



2) c#コンパイラは、クラスの前の静的修飾子(ILコード内)をどのように解釈しますか?

ILコードでは、次のようになります。

class public abstract auto ansi sealed beforefieldinit





さらに、コンパイラーはクラス内にコンストラクターメソッドも作成しません



3)フィールドとメソッドのどのアクセス修飾子はc#を実装しませんが、ILコードを実装しますか?

ファミリとアセンブリ -定義型(およびネストされた型)のメソッドおよび定義アセンブリの派生型でのみ使用可能



4) C#でUnionを宣言する方法を知っていますか(模倣)? つまり いくつかのフィールドをメモリ内の単一のオフセットから開始します。

[StructLayout(LayoutKind.Explicit)]

internal struct SomeValType {

[FieldOffset(O)] Byte b; // b

[FieldOffset(O)] Int16 x; // .

}








5)意味のある型(構造体)に対して、パラメーターなしでコンストラクターを定義できない(C#で)理由を疑問に思ったことはありませんか? これを回避することは可能ですか? :)

C#は、パラメータのないコンストラクターを意味のある型に定義することを許可しません。これにより、どのコンストラクターが呼び出されるか(すべてをゼロまたは私たちのもので初期化するコンストラクター)

ILでは、c#とは異なり、このようなコンストラクターを定義できます。 (それがどのように機能するかは別の質問です)



6)フィールドにタイプが定義されているコードをクライアントに提供した場合、クライアントはコードに基づいてコードを記述し、フィールドがプロパティに置き換えられた新しいバージョンのコードをクライアントに配信しました。

もちろん、まず第一に、すべてのメソッドはコンパイルを停止します。パラメータは、outまたはrefを持つフィールド(およびプロパティ)でした...さらに-

プロパティは読み取り専用にすることができます。

プロパティメソッドは例外につながる可能性があります

プロパティメソッドは時間がかかることがあります

連続して数回呼び出されるとプロパティは異なる値を返すことができます(4Ex.:DateTime.Now)

さらに、リフレクションを使用した場合、バインド中に例外も発生します。



7)すべてのイベントハンドラーはvoidを返す必要があります... MicrosoftはFCLライブラリの要件に従いますか? :))

実際、このような要件はイベントのメカニズムに組み込まれています。 これは必須です イベントが発生すると、いくつかのコールバックメソッドが機能し、それらから戻り値を取得することは不可能になります。

Microsoftは、いつものように、独自の方法で-推奨事項であってはなりません-例は、アセンブリタイプのオブジェクトを返すResolveEventHandlerイベントハンドラーです。 (証明リンク: tyts



PS質問と回答はCLRによってC#を介して Jeffrey Richterが作成しました...



All Articles