2012-05-08 6 views
1

기본 생성자에는 매개 변수가 없습니다. 또한 매개 변수없이 작성하는 생성자도 없습니다. 그렇다면 C#의 궁극적 인 차이점은 무엇입니까?기본 생성자와 매개 변수가없는 생성자의 차이점은 무엇입니까?

기본 생성자와 매개 변수없는 생성자를 상속 할 때 상속 유형에 완전히 동일하게 노출되는 경우 추가됩니까? 내 IOC 컨테이너가 그렇게 생각하지 않기 때문에. (단일성).

건배, 피트

답변

5

클래스에 명시 적 인스턴스 생성자가없는 경우 "기본"생성자가 C# 컴파일러에서 추가됩니다. 매개 변수가없는 생성자 public입니다. public이 아닌 매개 변수없는 명시 적 생성자를 생성 한 경우 Unity는 공용 생성자를 사용한 것과 동일한 방식으로 컴파일러에서 생성되었는지 여부와 관계없이 매개 변수가 있는지 여부에 관계없이이를 사용할 수 없습니다). 내가 코드를 드리겠습니다

1

기본 생성자는 매개 변수가없는 생성자 동의어입니다.

+0

사용자 지정 매개 변수가없는 생성자를 만들지 않는 한 동의어입니다. – superM

+0

동의어가 아닙니다. – spender

+1

아닙니다. MSDN : "'매개 변수를 사용하지 않는 생성자를 기본 생성자라고합니다. ' 기본값은 '자동 생성'을 의미하는 것이 아니라 파생 클래스에서 다른 클래스가 선택되지 않으면 기본적으로 생성자가 호출됩니다. –

1

생성자를 추가하지 않으면 매개 변수가없는 기본 생성자가 삽입됩니다. 매개 변수가 있거나없는 생성자를 추가하면 기본 생성자가 생성되지 않습니다.

3

매개 변수없는 생성자를 만들어 기본 생성자의 동작을 재정의 할 수 있습니다. 일반적으로 클래스의 멤버로 사용자 지정 개체가 있고 클래스 인스턴스가 만들어 질 때 기본값으로 초기화해야하는 경우가 자주 사용됩니다.

0

MSDN 상태 : 매개 변수를 사용하지 않는 생성자는 기본 생성자라고

. 기본 생성자는 new 연산자를 사용하여 객체가 인스턴스화되고 new에 인수가 제공되지 않을 때마다 호출됩니다.

따라서 기본 생성자는 이 아니며이 자동으로 생성되어야합니다. 손으로 쓴 매개 변수없는 생성자는 인 기본 생성자이기도합니다. B를 생성하는 동안 생성자가

class A 
{ 
    public A() { ... } // do something 
    public A(object o) { ... } // do something else 
} 

class B 
{ 
    public B() { ... } 
} 

라고 어느 : 당신이 파생 클래스에서 볼 때

이 실제로 의미가? 기본값은입니다.

2

@Sachin Kainth 및 @Fredrik Leijon 답변에 추가하면 .NET (Java에서도) 생성자가 상속되지 않습니다.

명시 적으로 기본 생성자를 호출하거나 기본적으로 기본 매개 변수가없는 생성자가 호출됩니다.

1

자체에 대한 이야기 ​​: 기본 생성자 효과적으로 당신이 (또는 매개 변수없이) 생성자를 지정하지 않을 때 자동으로 생성되는 매개 변수가없는 생성자입니다

public class ThisHasADefaultConstructor 
{ 
} 

public class ThisHasAParameterlessConstructor 
{ 
    public ThisHasAParameterlessConstructor() 
    { 
    } 
} 

참고.

1

더 많은 생성자를 원한다면 매개 변수없는 생성자가 필요할 수도 있습니다.매개 변수가없는 매개 변수와 매개 변수가있는 매개 변수가 있다고 가정 해 보겠습니다.

1

클래스에 매개 변수가있는 생성자 만있는 경우 매개 변수없는 생성자를 정의 할 수 없다면 사용할 수 없습니다. 즉, 클래스에 사용자 지정 생성자를 정의하면 기본 매개 변수가없는 생성자가 제공되지 않습니다. .

0

기본 생성자는 매개 변수가없는 생성자를 나타내며 자동으로 생성되거나 생성됩니다.

매개 변수가 있거나없는 다른 인스턴스 생성자를 선언하지 않으면 기본 생성자가 자동으로 만들어집니다. (정적 생성자를 선언해도 defautl 생성자가 자동으로 생성되는 것을 피할 수는 없습니다).

클래스 계층 구조의 생성자는 상속되지 않지만 상속 체인의 모든 생성자는 계층 루트에서 시작하여 파생 클래스의 생성자를 사용할 때 호출됩니다. 호출 할 생성자를 지정하지 않으면 각 클래스의 기본 생성자가 호출됩니다.

public class Base 
    { 
     public Base() 
     { 

     } 
    } 

    public class Derived : Base 
    { 
     public Derived() 
     { 

     } 
    } 

    // invokes, the Base() construtor, and then the Derived() constructor 
    var d = new Derived(); 

당신은 명시 적으로 또는 이렇게 같은 매개 변수없이 기본 클래스 생성자를 호출 할 수 있습니다 : 당신이 원하는 경우

 // Derived class explicitly invoking base class constructor. 
     public Derived() :base() 
     { 

     } 

, 당신과 같이 매개 변수를 사용하여 기본 클래스 생성자를 호출 할 수 있습니다

 public Derived(int j) :base(j) 

정도

 public Derived() :base(23) 

이 마지막 코드 샘플에서는 기본 생성자로 파생 개체를 만드는 경우 기본 클래스에서 호출 된 생성자는 기본 매개 변수가 아니라 정수 매개 변수가있는 생성자를 매개 변수 23과 함께 호출합니다.

(물론 매개 변수가있는이 생성자는 Base 클래스에 있어야합니다.)

명시 적으로 기본 기본 클래스의 생성자 만 호출 할 수 있습니다.

+0

귀하의 답변은 모순됩니다. ''기본 생성자 (...)는 매개 변수없이 명시 적으로 선언 된 생성자를 포함하고''매개 변수의 유무에 관계없이 생성자를 선언하면 기본 생성자가 선언되지 않습니다. ''. –

+0

@ JacekGorgoń 귀하의 의견을 보내 주셔서 감사합니다. 때때로 당신은 감각을 만드는 것처럼 보이는 것을 쓰고 전혀 이해하지 못합니다. 내 대답을 편집했습니다. – JotaBe

0

명시 적으로 작성자를 매개 변수없이 작성한 경우를 제외하고 기본 작성자는 컴필러에 의해 암시 적으로 호출됩니다.

관련 문제