我发现方面构造函数在编译时被调用,然后方面实例被序列化,然后在运行时被反序列化。
为什么会发生这种情况?执行反序列化而不是调用方面的构造函数是否更快?
所描述的过程主要允许您在编译时初始化一些方面的字段,然后反序列化将在每次程序运行时恢复这些值。如果字段计算很昂贵,这可以提高运行时性能 - 您可以在编译时运行一次。
例如,您可能希望在编译时构建日志记录方面的格式字符串,因为您已经拥有有关方法名称、参数、类型的信息。
此页面详细描述了整个方面的生命周期:http: //doc.postsharp.net/content/aspect-lifetime
但是,在不需要进行编译时初始化的情况下,最好也避免序列化步骤。PostSharp 允许您通过使用来做到这一点MsilAspectSerializer
- 这实际上会生成指令来调用构造函数并设置属性和字段。
这种情况记录在这里:http ://doc.postsharp.net/content/aspect-serialization
[OnMethodBoundaryAspectConfiguration(SerializerType=typeof(MsilAspectSerializer))]
public sealed MyAspect : OnMethodBoundaryAspect
{
//
}