1

コンパイル時にアスペクト コンストラクターが呼び出され、アスペクト インスタンスがシリアル化され、実行時に逆シリアル化されることがわかりました。

なぜこれが起こるのですか?アスペクトのコンストラクターを呼び出す代わりに、逆シリアル化を実行する方が高速ですか?

4

1 に答える 1

1

説明されているプロセスでは、主にコンパイル時にアスペクトのフィールドの一部を初期化できます。その後、逆シリアル化により、プログラムが実行されるたびに値が復元されます。フィールドの計算に負荷がかかる場合、これにより実行時のパフォーマンスが向上します。コンパイル時に 1 回だけ実行できます。

たとえば、メソッド名、パラメーター、タイプに関する情報が既にあるため、コンパイル時にロギング アスペクトのフォーマット文字列を作成することができます。

アスペクトのライフサイクル全体は、このページで詳細に説明されています: http://doc.postsharp.net/content/aspect-lifetime

ただし、コンパイル時の初期化を行う必要がない場合は、シリアライゼーション手順も避ける方がよい場合があります。PostSharp を使用すると、これを行うことができます。これによりMsilAspectSerializer、コンストラクターを呼び出してプロパティとフィールドを設定する命令が実際に生成されます。

このケースはここに文書化されています: http://doc.postsharp.net/content/aspect-serialization

[OnMethodBoundaryAspectConfiguration(SerializerType=typeof(MsilAspectSerializer))]
public sealed MyAspect : OnMethodBoundaryAspect
{
    //
}
于 2013-10-31T09:57:08.887 に答える