コンパイル時にアスペクト コンストラクターが呼び出され、アスペクト インスタンスがシリアル化され、実行時に逆シリアル化されることがわかりました。
なぜこれが起こるのですか?アスペクトのコンストラクターを呼び出す代わりに、逆シリアル化を実行する方が高速ですか?
説明されているプロセスでは、主にコンパイル時にアスペクトのフィールドの一部を初期化できます。その後、逆シリアル化により、プログラムが実行されるたびに値が復元されます。フィールドの計算に負荷がかかる場合、これにより実行時のパフォーマンスが向上します。コンパイル時に 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
{
//
}