瞬态场上的场初始化器

时间:2012-11-29 20:49:57

标签: c# db4o

我想知道:如果我从db4o数据库加载一个对象,是否会调用字段初始值设定项?

一个例子可能是瞬态字段syncRoot,用于对象锁定,因为线程安全:

public class Test
{
    [Transient]
    private object syncRoot = new object();

    [Transient]
    private object syncRoot2;

    public Test()
    {
        this.syncRoot2 = new object();
    }
}

db4o查询类似于:

Test mytestObject = (from Test test in session
                     select test).First(); 

我无法使用syncRoot2,因为在db4o查询期间,不会调用对象构造函数,因此该值将为null。但是syncRoot呢?在db4o模型对象上使用字段初始化器是否安全?

1 个答案:

答案 0 :(得分:1)

取决于:)

默认情况下没有,因为db4o会尝试避免调用ctor并在ctor中执行字段初始化程序)(至少使用VS 2010附带的C#编译器)。

例如,给定以下类定义:

public class Item
{
   public object o = new object();
}

C#编译器将发出类似于:

的IL(对于构造函数)
.class public auto ansi beforefieldinit Item extends [mscorlib]System.Object
{
   .field public object o
   .field public notserialized int32 i

   .method public hidebysig specialname rtspecialname 
                  instance void .ctor () cil managed 
   {
        .maxstack 8

        ldarg.0
        newobj instance void [mscorlib]System.Object::.ctor()  // field initializer
        stfld object Item::o // field initializer
        ldarg.0
        call instance void [mscorlib]System.Object::.ctor()
        ret
   }
}

基本上你有两个选择:

  1. Enable constructor调用
  2. 使用Activated事件初始化瞬态字段。
  3. 希望这有帮助