首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >瞬变字段上的字段初始化器

瞬变字段上的字段初始化器
EN

Stack Overflow用户
提问于 2012-11-30 04:49:57
回答 1查看 1.2K关注 0票数 1

我想知道:如果我从db4o数据库加载一个对象,字段初始化器是否总是被调用?

例如,由于线程安全,用于对象锁定的瞬态字段syncRoot就是一个例子:

代码语言:javascript
复制
public class Test
{
    [Transient]
    private object syncRoot = new object();

    [Transient]
    private object syncRoot2;

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

db4o查询如下所示:

代码语言:javascript
复制
Test mytestObject = (from Test test in session
                     select test).First(); 

我不能使用syncRoot2,因为在db4o查询期间,不会调用对象构造函数,因此值将为null。但是syncRoot呢?在db4o模型对象上使用字段初始值设定项安全吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-30 18:53:34

这取决于:)

默认情况下不会,因为db4o会尽量避免调用ctor,字段初始化器是在ctor中执行的(至少使用VS2010附带的C#编译器)。

例如,给定以下类定义:

代码语言:javascript
复制
public class Item
{
   public object o = new object();
}

C#编译器将发出IL (用于构造函数),如下所示:

代码语言:javascript
复制
.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 invocations
  2. Use Activated事件。

希望这能有所帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13634476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档