2011-03-18 9 views
23

A) 다음 코드에서 DataTools.LoadSearchList() 메서드는 한 번만 호출되거나 속성에 액세스 할 때마다 호출됩니까?정적 속성 초기화

public static IEnumerable<string> SearchWordList 
{ 
    get 
    { 
     return DataTools.LoadSearchList(); 
    } 
} 

B)이 점에 어떤 차이가 있습니까?

public static IEnumerable<string> SearchWordList = DataTools.LoadSearchList(); 
+4

속성 및 필드는 코딩의 관점에서 볼 때 비슷하지만 완전히 다르게 동작합니다. 속성은 실제로 한 쌍의 get/set 메서드에 대한 바로 가기이며 다른 메서드와 마찬가지로 본문은 호출 할 때마다 실행됩니다 .. – MattDavey

답변

29

첫 번째 예제에서는 속성에 액세스 할 때마다 LoadSearchList()가 호출됩니다.

두 번째로 LoadSearchList()는 한 번만 호출됩니다 (하지만 속성이 아닌 필드이므로 사용 여부에 관계없이 호출됩니다).

더 좋은 옵션이 될 수 있습니다

private static IEnumerable<string> _searchWordList; 

public static IEnumerable<string> SearchWordList 
{ 
    get 
    { 
     return _searchWordList ?? 
      (_searchWordList = DataTools.LoadSearchList()); 
    } 
} 

아니면 .NET 4.0을 사용하는 경우 뭔가가 스레드 안전 당신이 Lazy<T>을 사용할 수 원하는 존 소총가 언급 한 바와 같이, (나는 문법이 정확해야한다고 생각 하지만 나를 붙들 지마.) :

private static Lazy<IEnumerable<string>> _searchWordList = 
    new Lazy<IEnumerable<string>>(() => DataTools.LoadSearchList()); 

public static IEnumerable<string> SearchWordList 
{ 
    get { return _searchWordList.Value; } 
} 
+3

여러 명이있는 경우 두 번 이상 호출 될 수 있습니다 관련된 스레드. 개인적으로'Lazy '을 .NET 4에서 사용하는 것을 선호합니다 (옵션 인 경우). 그런 다음 두 번째 동시 호출 블록을 만들기 위해 이러한 종류의 조정을 쉽게 수행 할 수 있습니다. –

+0

@Jon Skeet - 예제를 사용하여 업데이트되었습니다 ... 바라건대 나는 구문이 올바르다. –

+2

나에게 잘 어울리는 데, 생각 만 해본다면 메소드 그룹 변환을 사용하기 위해'new Lazy > (DataTools.LoadSearchList)'를 할 수있을 것이라고 생각한다. –

12

첫 번째 경우에는 속성에 액세스 할 때마다 메서드가 호출됩니다. 필드로 설정되면 정확하게 초기화 된 유형 (0 번부터 38 번까지)을 액세스 할 수 있습니다. 에 액세스했습니다. 당신이 게으르게 초기화 값을 원하는 경우

, 내가 .NET에서 Lazy<T>을 권하고 싶습니다 4.

2

예,이 건물은 DataTools.LoadSearchList() 할 때마다 액세스를 호출합니다. 정적 필드는 메서드를 한 번만 호출합니다.