2012-11-29 3 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 쿼리 중에 객체 생성자가 호출되지 않기 때문에 값은 null이 될 것이기 때문입니다. 그러나 syncRoot은 어떨까요? db4o 모델 객체에서 필드 이니셜 라이저를 사용하는 것이 안전합니까?

+0

내가 db4o는에 대해 아무것도 몰라하는 데 도움이,하지만 난 syncRoot 항상 초기화됩니다 것을 알고있다. .NET 프레임 워크는 필드 이니셜 라이저가 생성자보다 먼저 실행되도록합니다. – phoog

답변

1

그것은 의존하지 :

기본적으로 더, db4o는이 ctor에 내에서 실행되는 ctor에 현장 초기화) (적어도 VS 2010와 함께 제공되는 C# 컴파일러)를 사용하여 호출 피하려고하기 때문에.

: 여기서 두 가지 옵션이 기본적으로

.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 
    } 
} 

:

public class Item 
{ 
    public object o = new object(); 
} 

C# 컴파일러는 (생성자에 대한) IL을 내 보냅니다과 유사한 다음 클래스 정의 주어진 예를 들어

,

  1. Enable constructor 호발
  2. Activated 이벤트를 사용하여 임시 필드를 초기화하십시오.

희망이

+0

답변을 주셔서 감사합니다, 그 필드 이니셜 라이저가 내부적으로 생성자 내에서 호출되는 것을 몰랐습니다. '활성화 된'이벤트 옵션이 필요한 것입니다. –