2012-07-02 3 views
3

나는 다음과 같은 경우 :클로저에서 고정 된 읽기 전용 값 유형이 해제 되었습니까?

static readonly TimeSpan ExpiredAfter = TimeSpan.FromMilliseconds(60000); 

foreach (ModuleInfo info in moduleList.Where(i => DateTime.Now - i.LastPulseTime > ExpiredAfter).ToArray()) 
    moduleList.Remove(info); 

은 해제 얻을 ExpiredAfter 않거나 컴파일러는 직접 액세스 할 수 있습니다 알고 있나요? 이런 식으로 작성하는 것이 더 효율적이 될 것이다 :

static readonly TimeSpan ExpiredAfter = TimeSpan.FromMilliseconds(60000); 

static bool HasExpired(ModuleInfo i) { return DateTime.Now - i.LastPulseTime > ExpiredAfter; } 

foreach (ModuleInfo info in moduleList.Where(HasExpired).ToArray()) 
    moduleList.Remove(info); 

답변

1

정적 (또는 그와 관련하여 모든 필드) 필드를 캡처 할 수 없습니다. 언어 규격에서

:

7.15.5 외부 변수 모든 로컬 변수 값 파라미터, 또는 그 범위 람다 표현식 또는 익명 방법 표현식을 포함하는 바깥 호출 파라미터 배열 익명 함수 의 변수입니다. 클래스의 인스턴스 함수 멤버에서 this 값은 값 매개 변수로 간주되며 함수 멤버 내에 포함 된 임의의 익명 함수 인 의 외부 변수입니다.

7.15.5.1 캡처 된 외부 변수 외부 변수가 익명 함수에 의해 참조되는 경우 외부 변수는 익명 함수에 의해 캡처 된 것으로 간주됩니다.

정적 필드는 절대 값 매개 변수 또는 매개 변수 배열이 아닙니다.

그런데 컴파일러가 이유가없는 this을 캡처하는 some strange corner cases을 보았지만 그 중 하나는 아닙니다. 나는 인스턴스와 정적 인 클로징 방법의 경우에 람다 용 C# 4.0 컴파일러에 의해 생성 된 코드가 '수동'버전과 거의 동일하다는 것을 디 컴파일러로 확인했습니다 ... 을 제외하고 컴파일러가 나타납니다. (정적 필드에서) 결과 대리자에 대한 참조를 캐싱하고 다시 사용하는 것입니다. 람다의 경우에만입니다. 이것은 어긋나게 반향 방식으로 을 더 빠르게으로 만들고 (이 방법의 다중 실행에 비해) method-group 방법보다 메모리 압박을 덜어줍니다! 당신은 벤치마킹을 통해 두 가지 방법을 모두 찾아야합니다.

+1

저는 위임자 생성, 멋진 답변을 잊어 버렸습니다! – Tergiver

+0

나는 이것이 컴파일러로 하여금 생각하게하는 또 다른 사례라고 생각한다.) – Tergiver

+0

@Tergiver : 매우 사실. 그러나 영향을보기 위해 벤치마킹 할 가치가 있습니다. – Ani

1

은 해제 얻을 ExpiredAfter 않거나 컴파일러는 직접 액세스 할 수 있습니다 알고 있나요?

가장 쉬운 방법은 코드를 컴파일 한 다음 리플 렉터 등에서 디 컴파일하는 것입니다. 난 그냥 정적 변수를 직접 액세스하는 정적 메서드를 생성하는 컴파일러를 기대하고있다.

는이처럼 쓰는 것이 더 효율적 같습니다

다시, 그런 식으로 쓸 수 더 효율적하더라도 :) 스스로를 테스트, 그게하지 것이다 반드시 올바른 선택. 어느 것이 더 읽을 수 있습니까? 약간의 코드가 성능에 얼마나 중요한가? 이미 충분히 입니다?

관련 문제