1

我想知道:如果我从 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 模型对象上使用字段初始化器是否安全?

4

1 回答 1

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. 启用构造函数调用
  2. 使用Activated事件来初始化瞬态字段。

希望这可以帮助

于 2012-11-30T10:53:33.630 回答