2012-11-29 41 views
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查詢期間,對象構造函數不會被調用,所以該值將爲空。但是syncRoot呢?在db4o模型對象上使用字段初始值設定項安全嗎?

+0

我不知道關於db4o什麼,但我知道,SyncRoot上總是會被初始化。 .NET框架確保字段初始值設定項將在構造函數之前運行。 – phoog

回答

1

這取決於:)

默認情況下沒有,因爲db4o的會盡量避免調用構造函數和字段初始的構造函數中執行)(至少使用隨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 invocations
  2. 使用Activated事件來初始化瞬態字段。

希望這有助於

+0

感謝您的答案,我不知道字段初始值設定項在構造函數內部調用。 「激活」事件選項是我所需要的 –

相關問題