2012-04-23 2 views
6

내가 같은 일반적인 방법을했습니다 가정 :C#에서 범용 메서드를 인스턴스화하는 방법은 무엇입니까?

void Fun<T>(FunArg arg) {} 

this.Fun<Feature>하고 일반적인 방법의 this.Fun<Category> 다른 인스턴스화?

일반적으로 일반 메소드는 어떻게 인스턴스화됩니까? 다른 일반적인 인수는 런타임에 사용되는 다른 메타 데이터와 함께 다른 메소드 또는 동일한 메소드를 생성합니까?

언어 사양의 일부 견적과 함께 답변을 지원하십시오.

client.SomeEvent += this.Fun<Feature>; //line1 
client.SomeEvent += this.Fun<Category>; //line2 
client.SomeEvent += this.Fun<Result>; //line3 

다음 나중에는

client.SomeEvent -= this.Fun<Feature>; //lineX 

lineX 내가 line1에서했던 일을 취소 하는가 :

또한, 나는이했다 생각? 아니면 somethig에 달려 있습니까?

+0

시작 코드가 올바르지 않습니다. 메서드 그룹 변환을'var' 선언의 대상으로 사용할 수 없습니다. 유효한 코드를 제시하면 더 나은 대답을 줄 수 있습니다. –

+0

@JonSkeet : 그 부분을 제거했습니다. – Nawaz

+0

이 시점에서 "인스턴스화"란 정확히 * 정확히 * 무엇을 의미합니까? 질문에 명확해질수록 답이 명확해질 수 있습니다. –

답변

4

관련 유형에 따라 다릅니다. 모든 참조 유형의

(예. 클래스), 하나 방법은 그들 모두를 처리 할 수 ​​JITted됩니다. 모든 치형

(예. 구조체) 유형별 가 JITted한다 하나 방법.

FeatureCategory이 참조 유형 인 경우 문제의 정보가 충분히 자세하지 않아서 그렇습니다. 그렇다면 한 가지 방법으로이를 해결할 수 있습니다. 둘 중 하나 또는 둘 다 값 유형 인 경우 값 유형 당 하나의 메소드가 JIT됩니다.

여기에이라는 단어를 사용합니다. 컴파일 된 어셈블리에는 단 하나의 메소드 만 있지만 런타임에 JITter는 위의 규칙에 따라 일반 메소드의 실제 구현을 작성합니다.

팝 퀴즈 : 일반 유형/방법을 사용하는 어셈블리에서 NGEN을 사용하면 어떻게됩니까? (힌트 : not what you think)

0

예, 두 개의 개별 메소드가됩니다.

+1

출처가 있습니까? –

+0

도움이 될까요? http://msdn.microsoft.com/en-us/library/twcad0zb(v=vs.80).aspx –

+0

질문을 너무 자세히 보지 않아서이 대답을 삭제해야 할 수도 있습니다. –

5

그들은 모두가 공유하는 방법 정의을하지만, 런타임에 그들은 다른 MethodInfo - 제네릭 형식 인수가 일반적인 방법을 정의 때문이다.

지원 그림 : JIT 수준에서

Action<FunArg> a1 = Fun<X>; 
    Action<FunArg> a2 = Fun<Y>; 
    Action<FunArg> a3 = Fun<Y>; 
    Console.WriteLine(a1.Method == a2.Method); // false 
    Console.WriteLine(a3.Method == a2.Method); // true 

, 그것은 더 복잡하다; 모든 참조 유형 매개 변수는 공유 구현입니다. 참조는 참조이므로 참조 (모든 T은 사전에 제약 조건을 충족시켜야합니다).값 유형이 T 인 경우 일반 유형 인수의 모든 조합은 각각 다른 최종 구현을 필요로하기 때문에 런타임에 별도의 구현을 가져옵니다.

+0

일리노이 수준에서는 간단하지 않지만 네이티브 (JIT- 컴파일) 수준에서는 복잡합니까? –

+0

@ 존 - 참으로; "제약 된"연산 코드를 좋아해야합니다. 나는 잘못된 문구를 사용했습니다 ... –

+0

더 많은 질문으로 내 질문을 업데이트했습니다. 제발 그 :-) – Nawaz

관련 문제