2013-09-02 2 views
3

나는 오랜 시간 내내이 질문을하고 있습니다. 그것을 게시하는 생각. .Net의 모든 클래스는 객체 클래스에서 상속되므로 새 클래스를 만드는 동안 객체 클래스를 상속하지 않아도됩니다. 이 경우 프레임 워크가 기본적으로 수행하는 작업이 있습니까?C# 새 클래스를 생성하는 동안 객체 클래스를 상속하지 않아도되는 이유

class Test 
     { 
      public override string ToString() 
      { 
       return base.ToString(); 
      } 
     } 


class MyClass : Object 
     { 
      public override string ToString() 
      { 
       return base.ToString(); 
      } 
     } 

위의 두 클래스 선언에는 어떤 차이가 있습니까?

답변

12

모든 class은 기본적으로 object을 상속합니다. 컴파일러가 컴파일하는 동안 컴파일러가이를 수행 할 것이기 때문에이를 지정할 필요가 없습니다. 명세서에서 촬영

예 :

class A {}

class B: A {}

(...) A 이후

명시 직접 기본 클래스를 지정하지 않고는 직접적인 기본 클래스는 암시 적으로object입니다.

신고 사항간에 차이는 없습니다.

개체 클래스 형식은 다른 모든 형식의 궁극적 인 기본 클래스입니다. C#의 모든 유형은 객체 클래스 유형에서 직접 또는 간접적으로 파생됩니다.

C# 5 사양

IT의 의미, 클래스 C1 이미 다른 클래스 C2C2 클래스 상속을 통해 이미 사용할 수 있기 때문에 object 상속, 컴파일러에 의해 추가되지에게 상속하는 경우 그. 상속 트리의 맨 위에 항상 System.Object 클래스가 있습니다.

+0

좋습니다. 한 가지 더 질문드립니다. 다른 클래스에서 MyClass를 상속하면 멀티 레벨 상속 또는 다중 레벨 상속이 가능합니까? 이것은 바보 같은 질문이지만 내 의심을위한 것임을 압니다. –

+0

내 업데이트를 참조하십시오. 다중 상속은 C#에서 사용할 수 없습니다. – MarcinJuraszek

+0

예. 고맙습니다. ..:) –

2

MSDN; .NET Framework의 모든 클래스는 객체, Object 클래스에 정의 된 모든 방법에서 파생되기 때문에

는 시스템의 모든 개체 에서 사용할 수 있습니다.

따라서 이 아닙니다. 그들은 동일합니다.

1

컴파일러가 객체를 무시하는 IL 코드를 확인할 수 있습니다.

private class MyClass 
    { 

     public MyClass() 
     { 
      ldarg.0 
      call  System.Object..ctor() 
      ret 
     } 

     public override string ToString() 
     { 
      locals: 
       V_0: string 

      ldarg.0 
      call  string System.Object.ToString() 
      stloc.0 
      ldloc.0 
      ret 
     } 

    } // class MyClass 

    private class Test 
    { 

     public Test() 
     { 
      ldarg.0 
      call  System.Object..ctor() 
      ret 
     } 

     public override string ToString() 
     { 
      locals: 
       V_0: string 

      ldarg.0 
      call  string System.Object.ToString() 
      stloc.0 
      ldloc.0 
      ret 
     } 

    } // class Test 
관련 문제