2012-11-06 2 views
-7

나는 List of States를 반환하는 하나의 C# 함수를 가지고 있습니다. 이 함수는 정적 변수처럼 한 번만 호출되어야합니다. 이 상태 목록이 동일 될 것입니다 이후 많은 곳에서이 함수를 호출하고있어함수는 한 번만 호출해야합니다.

 



    public List GetStateList() 
    { 
     List lstState=new List(); 
     lstState.add("State1"); 
     lstState.add("State2"); 
     lstState.add("State3"); 

     return lstState; 
    } 

그래서 나는이 기능은 한 번 전화를받을해야합니다,이 기능은 다시 만들 안이라는지고 다음 번 전체 목록 다시.

어떻게 이것을 C#에서 얻을 수 있습니까?

+1

각 호출에서 같은 (정적?) 목록을 반환합니다. –

+0

여기에 코드를 업로드하십시오 ............. – andy

+1

이 질문은 '정적'이 의미하는 것과 의도 된 결과가 실제로 무엇인지에 대한 심각한 오해를 배신하는 것으로 보입니다. 우리는 정말로 당신이 정말로 원하는 것에 대한 더 많은 정보를 필요로합니다. –

답변

2

메모하기. 그것은 여전히 ​​여러 번 호출 할 수 있지만 한 번에 전체 작업을 할 수 있습니다 : 모든 일에

  1. 잠금 :

    private List<string> _states; //if GetStateList() doesn't depend on object 
               //state, then this can be static. 
    public List GetStateList() 
    { 
        if(_states == null) 
        { 
        List lstState=new List(); 
        lstState.add("State1"); 
        lstState.add("State2"); 
        lstState.add("State3"); 
        _states = lstState; 
        } 
        return _states; 
    } 
    

    이 스레딩 문제에 따라 다음 중 하나를 할 수 있습니다. 단일 실행 보장.

  2. _states으로 지정 지정을 잠급니다. 초기에는 불필요한 작업이있을 수 있지만 모든 발신자에게는 동일한 대상이 제공됩니다.
  3. 초기 호출자가 서로를 덮어 쓸 수 있습니다.

마지막 통화가 가장 낭비적인 것처럼 보일 수 있지만, 서로 다른 통화가 불필요하게 서로 겹쳐 쓸 수있는 초기 기간 이후에는 그 통화가 가장 간단하고 신속 해집니다. 얼마나 많은 작업이 이루어지고 얼마나 자주 작업이 수행되는지에 따라 달라지며 _states이 할당되기 전에 얼마나 자주 호출 될 수 있습니다.

+0

이중 잠금을 사용할 수도 있고, 간단히 말해서 게으른 인스턴스 생성을 피하고 목록을 미리 만들 수도 있습니다. 노력을 보증 할 수있는 상태 목록을 만들 때 메모리 나 CPU에 충분한 오버 헤드가 없습니다. –

1

목록을 재사용 할 때 한 가지 문제는 발신자가이 목록을 수정할 수 있기 때문에 기존 목록에 영향을 미칩니다. 이렇게 적은 양의 데이터만으로도 장기적으로 당신을 구해줄 수는 없습니다. 매번 새로운 배열을 반환하는 것이 좋을 것 같습니다.

저는 게으른 인스턴스 생성을 신경 쓰지 않을 것입니다. 생성자에서 그것을 채우고 수행 할 수 :

public static class States { 
    static States() { 
     All = Array.AsReadOnly(new string[] { "state1", "state2", "state3" }); 
    } 
    public static readonly ReadOnlyCollection<string> All; 
} 

지금이 스레드 안전 (상대적으로) 증거를 변조하고, 무엇보다도, 간단한.

관련 문제