2014-10-09 3 views
2

제네릭 함수는 nullable 값 형식과 잘 작동합니까? 아니면 뒤에 숨겨져 있습니까?일반 함수 및 값 형식

예를 들어이 같은 도우미 함수가 있습니다

var log = person.Return(p => p.log, emptylog) 

그래서 여부 log에 따라 값이 예를 들어 내가 뭔가가 null의 경우 대체 값을 제공하는 데 사용

public static TResult Return<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator, TResult failureValue) 
    where TInput : class 
{ 
    if (o == null) return failureValue; 
    return evaluator(o); 
} 

, 또는 참조 유형을 사용하는 경우 복싱없이 값 유형을 처리하기 위해 Return()의 특수화 된 버전이 필요합니까 아니면 모든 경우에 위의 결과가 좋을까요?

편집 : 나는이 http://pastebin.com/vdS1uNu1의 저자는 클래스에 대한 전문화가 왜 궁금 해요 - 그 상자 값 유형하지 않습니다,

답변

3

없음 등> 클래스 - -> 구조체, 클래스하지만 TResult에 다른 값 유형을 사용할 때마다 (JIT 시간에) 메소드의 새로운 기본 구현을 작성하게됩니다. 반면에 모든 참조 유형은 동일한 원시 코드를 공유합니다. 그게 입니다. 매우은 거의 문제가되지 않습니다. 이것은 호출 당 오버 헤드와는 다릅니다. 복싱을 피할 수있게 해주는 "타입 인자에 기반한 올바른 네이티브 코드 생성"입니다.

+0

감사합니다. 그렇다면이 코드는 왜 value/ref 유형에 대한 특수화 된 구현을 제공합니까? 제약되지 않은 TResult는 그냥 작동합니까? http://pastebin.com/vdS1uNu1 – user826840

+1

@ user826840 : 아니요, 그 중 일부 메소드는'TResult? '를 사용하기 때문에 - TResult가 null이 아닌 값 유형으로 제한 될 때만 유효합니다. –

+0

그러나 나는 할 경우'공공 정적 TResult MYTEST (이 TInput 입력, Func을 람다) \t \t { \t \t \t 반환 입력 == 널 (null)을? 기본값 (TResult) : 람다 (입력); \t \t} 'ref, value 또는 nullable 값 유형을 반환 할 때 작동하는 것으로 보입니다. 따라서 특별한 구현에는 전혀 요점이 없습니까? 나는 왜 그가 귀찮게했는지 궁금하다. Thanks – user826840