2012-03-09 5 views
2

예를 들어, 소스 코드에 정적 클래스를 도입하면 csc 컴파일러는이를 sealed 추상 클래스로 바꿉니다 (잘못된 경우 제발 수정하십시오).IL은 INTERFACE가 무엇인지 알고 있습니까?

하지만 인터페이스는 어떻습니까? CLR은 인터페이스가 무엇인지 알고 있습니까? 또는 컴파일러가이를 일종의 선언으로 변환합니까?

+4

컴파일러가 추상 클래스를 봉인 된 클래스로 변환 한 경우 추상 클래스를 구현하기 위해 클래스에서 파생 된 클래스는 어떻게 될까요? – hvd

+2

추상 클래스는 정적 밀폐 클래스와 매우 다릅니다. 왜 컴파일러가 하나가되어 버렸다고 생각하니? 그리고 예, 컴파일러는 인터페이스 유형을 만듭니다. –

+0

어셈블리를 컴파일 한 다음 ildasm을 사용하여 보았습니까? –

답변

10

는 CSC 컴파일러는 밀봉 정적 클래스 (내가 잘못 제발 나는 경우 정정 해줘)로 바뀝니다.

나는 당신을 시정하고 있습니다.

.class public abstract auto ansi beforefieldinit Foo 
    extends [mscorlib]System.Object 
{ 
    .method family hidebysig specialname rtspecialname instance void .ctor() cil managed 
    { 
    } 
} 

하지만 어떻게 인터페이스에 대한;

public abstract class Foo 
{ 

} 

는 IL에서 다음과 같습니다

추상 클래스와 같은 CLR은 인터페이스가 무엇인지 알고 있습니까?

예, 알고 있습니다. 예를 들어 :

.class public interface abstract auto ansi IFoo 
{ 
} 
+0

나는 질문을 해결했습니다; 나는 포스트 후에 그것을 알아 차렸다; 죄송합니다. – pencilCake

+0

@pencilCake, 대답이 업데이트되었습니다. –

7

틀림 : static classsealed abstract class으로 변환됩니다.

인터페이스는 다른 유형의 다른 메타 데이터 및 동작 (예 : 다중 상속)을 사용하여 .NET의 정회원입니다. 당신이 당신의 소스 코드에서 추상 클래스를 소개 예를 들어

+0

완전히 맞습니다. 나는 그 문제를 해결했다. 내 나쁜 (일리노이에서 정적 클래스 -> 봉인 된 추상) – pencilCake

3

여기 ILSpy 다음 코드를 보여줍니다 무엇 :

public interface IFoo 
{ 

} 

는로 변환합니다.

C 번호 :

interface A 
{ 
    void M(); 
} 

IL :

.class interface nested private auto ansi abstract A 
{ 
    // Methods 
    .method public hidebysig newslot abstract virtual 
     instance void M() cil managed 
    { 
    } // end of method A::M 

} // end of class A 

그래서, 네, 알고 않습니다.

1

이 인터페이스는 CLR에 모습입니다 :

.class public interface abstract auto ansi IDisposable 
{ 
    .custom instance void System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = { bool(true) } 
    .method public hidebysig newslot abstract virtual instance void Dispose() cil managed 
    { 
    } 
} 

는 IDisposable을 예로 들어.

관련 문제