我想知道:如果我从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模型对象上使用字段初始值设定项安全吗?
发布于 2012-11-30 18:53:34
这取决于:)
默认情况下不会,因为db4o会尽量避免调用ctor,字段初始化器是在ctor中执行的(至少使用VS2010附带的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
}
}基本上,你有两个选择:
初始化瞬态字段的
希望这能有所帮助
https://stackoverflow.com/questions/13634476
复制相似问题