2011-03-15 4 views
3

this동적 개체를 C# 4.0에서 읽었습니다.
예제 TryGetMember 함수 (GetMemberBinder 바인더, out 오브젝트 결과)의 두 번째 인수는 Object 유형입니다. 나는 MSDN을보고 다른 메소드가 Object로 인수를 얻고 있다는 것을 알게되었습니다. 왜이 기능들은 일반적인 것이 아닙니까? 복싱/언 박싱이 제네릭을 사용하는 것이 좋습니다되지 않을 것 비싼 경우 간단한 과제, 권투와 언 박싱과 관련 MSDNDynamicObject 클래스의 메서드가 제네릭이 아닌 이유는 무엇입니까?

에서
는 계산 비용 프로세스

입니까?

감사합니다.

+2

'TryGetMember'의 발신자가 실제로 어떤 유형을 얻게 될지 알고 계십니까? – Gabe

답변

8

"간단한 할당과 관련하여"유의하십시오. 즉, 가능한 가장 저렴한 작업 중 하나와 비교하여, 권투는 비싸다.

동적 입력에 관련된 기계의 나머지 부분과 비교, 권투 저렴 :) TryGetMember 제네릭 인 경우

, 즉 기대하는 유형을 알아야 할 것이다 발신자을 의미 할 것입니다. 동적 타이핑의 요점 중 하나는 호출자 이 무슨 일이 일어날 지 보증 할 수 없다는 것입니다. 내가 쓰는 경우에만SomeProperty를 사용하는 Console.WriteLine의 과부하있는 해결 것

dynamic foo = GetDynamicValueFromSomewhere(); 
Console.WriteLine(foo.SomeProperty); 

평가되고있다. "예상 된"반환 형식이 없습니다 ... 그래서 어떤 일반 형식 인수를 사용할 것으로 기대합니까?

어쨌든 대부분의 동적 입력 시나리오는 CLR의 중간 표현식으로 object을 사용합니다. 내가 쓰는 경우 :

이미
권투 있어
dynamic x = 10; 

그. CLR에서는 "언 박싱 된 값 유형의 불확정 유형"을 나타낼 수 없습니다. (얼마나 많은 공간을 할당 할 것입니까?)

+0

위대한 설명, 고마워요. –

+0

@OP : 호출자가 형식을 보증 할 수있을뿐만 아니라 호출자가 ** SomeProperty' 속성을 가지고있는 한 반환하는 형식이 무엇인지 신경 쓰지 않는 것이 동적 입력의 목적입니다. 유형이 값 또는 참조 유형이어야한다는 것은 어디에도 지정되어 있지 않으므로 런타임까지 복싱 작업의 존재 여부를 알 수 없습니다. – SWeko

+0

그럼에도 불구하고, 권투의 성능 패널티는 실제로 할당되지 않습니다, 그것은 할당을 수행하는 부작용입니다. 이것은 매우 단단한 고리이며 gen-0 컬렉션 빈도가 올라가면 gen-1로 프로모션이 증가 할 수 있으며 이는 Gen-2 컬렉션의 가능성을 높일 수 있습니다. API에 유형의 수퍼 집합으로 반환 된 일종의 값 유형 구조체가있는 경우 훨씬 더 행복 할 것입니다. 낡은 VARIANT와 같지만 조합은 아닙니다. –

관련 문제