我想知道:如果我从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模型对象上使用字段初始化器是否安全?
答案 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
}
}
基本上你有两个选择:
希望这有帮助