2010-01-23 2 views
3

호기심에서 벗어나 System.Object 클래스의 구현을 검사하기 위해 mscorlib.dll을 디스 어셈블했습니다.System.Object 클래스의 메서드 완료

나는 이상한 것을 발견했습니다.

1).  
public class Object { 
... 
    protected override void Finalize(){} 
... 
} 

어떻게 기본 클래스에 재정의 된 메소드가 있습니까?

2) public class Employee { 
      public void InstanceMethod() { 
       this.Finalize(); 
       //Does not compile, can i not access protected methods of base class?? 
      } 
     } 

난 그냥 Object 클래스에서 "보호의 Finalize"방법을 사용 무엇이 궁금하고 왜 컴파일러에 의해 특별 대우를 가지고있다?

답변

0

체크 아웃 Object.Finalize에 MSDN :

는 소멸자 정리 작업을 수행하기위한 C#을 메커니즘입니다. 소멸자는 기본 유형의 소멸자를 자동으로 호출하는 것과 같은 적절한 보호 수단을 제공합니다. C# 코드에서는 Object.Finalize를 호출하거나 재정의 할 수 없습니다.

따라서 귀하의 질문에 대한 답변은 다음과 같습니다. 음 - CLR 내부의 일부입니다.

public class Employee 
{ 
    //Finalizer, also known as "destructor" 
    ~Employee() 
    { 

    } 
} 
4

그것은 리플렉터에 버그가 가상의 그러나 "newslot"속성을 가지고 있지 않으며이없는 방법으로 혼동됩니다입니다 : C# 컴파일러는 예를 들어 작성할 때 필요한 모든 작업을 수행 기본 클래스 유형. 디 컴파일러를 IL로 전환하면 쉽게 볼 수 있습니다. C#의이 ~MyClass으로 VB.NET에 기록 된 두 번째 질문에 대한

// Allow an object to free resources before the object is reclaimed by the GC. 
// 
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
~Object() 
{ 
} 
+0

+1 반사경의 버그를 지적합니다. 나는 항상 그것에 맹목적으로 의지했다 :). 리플렉터를 사용하는 동안 IL을 직접 확인하는 것이 좋습니다. –

1

, 상기 참조 원본에서 복사로 당신이 할 예상대로

종료 자의 실제 선언은, 많이 Protected Overrides Sub Finalize()protected override Finalize()과 동일합니다. 그래서 그것은 단지 C# 구문 차이입니다. 첫 번째 질문에 대한

는 반사판에 오버라이드 (override)에 비해 일반적으로 새로운 가상 멤버에서 볼 newslot 속성이 누락되어

.method family hidebysig virtual instance void Finalize() cil managed 

입니다.