3

위대한 코드를 작성했지만 왜 작동하는지 이해할 수 없습니다. 정수를 말하자면 클래스를 직렬화하고 싶습니다. 그래서 여기에 클래스 코드가 있습니다.기본 매개 변수를 가진 생성자와 조합 된 직렬화를위한 매개 변수없는 생성자입니다. 왜 작동합니까?

[Serializable] 
public class TestClass 
{ 
    public int Variable; 
} 

는 지금은이 클래스의 인스턴스를 만들 수있는 가능성을 가지고 바로 Variable을 설정하고자합니다. 그래서 나는 serializer를위한 생성자와 프라이빗 디폴트 생성자를 생성한다.

[Serializable] 
public class TestClass 
{ 
    public int Variable; 

    private TestClass() {} 

    public TestClass(int value) 
    { 
     Variable = value; 
    }  
} 

그래서이 코드를 사용하면 기본 매개 변수가 편리해집니다. 그래서 저는이 기술을 공공 생성자에게 적용했습니다.

[Serializable] 
public class TestClass 
{ 
    public int Variable; 

    private TestClass() {} 

    public TestClass(int value = 0) 
    { 
     Variable = value; 
    }  
} 

이 모든 것이 정상적으로 작동하지만 그 이유는 무엇입니까? 같은 정의를 가진 두 개의 생성자가 없습니까? 기본 생성자를 공용으로 설정하더라도 모든 것이 잘 동작합니다. 일단 기본 생성자를 제거하면 직렬화에 실패합니다. 내 첫 번째 추측은 .NET의 XmlSerialize가 기본 매개 변수로 생성자를 확인하지 않는다는 것입니다. 하지만 컴파일러가이 코드를 허용하는 이유는 무엇입니까?

나는이 그냥 궁금뿐만 아니라, 배우고 더 좋은 일들이 내부적으로 어떻게 작동하는지 이해하기 바란다. 인터넷 검색은 유용한 검색어를 찾지 못했기 때문에 유용하지 않습니다.

+1

"이제 같은 정의를 가진 두 개의 생성자가 없습니까?" - 같은 정의를 가진 두 개의 생성자가 보입니까? 나는하지 않는다. – AakashM

+0

기본 인수를 사용하는 생성자는 nullary 생성자 (인수를 사용하지 않는 생성자)가 오버로드 된 것으로 보이므로 컴파일러가 불평하지 않았습니다. 또한 기본 인수가있는 생성자가 직렬화에 필요한 예상 생성자가 아닌 것 같습니다. 지금 발생하는 질문은 private 생성자를 protected로 만들고 suclass에서 새로운 TestClass()를 할 경우 어떤 생성자가 호출되는지입니다. – Diego

+1

@Diego가 가장 일치하는 전화입니다. 이 경우 인수가 삽입 될 필요가 없으므로 기본 생성자가 가장 일치합니다. 다른 말로하면, 호출에 인수를 제공하지 않고 특정 생성자를 호출 할 방법이 없으므로 기본값은 중복됩니다. –

답변

5

XmlSerializer에는 매개 변수없는 생성자를 사용하도록 직렬화하는 클래스가 필요하며 개인용 생성자에 중단 점을 넣으면 직렬화가 중단되는 것을 알 수 있습니다. 기본 인수 생성자는 매개 변수 컴파일러에 의해 당신을 위해 삽입 를 취하는 생성자, 매개 변수없는 생성자가 아닙니다. 단지 기본 인수 (또는 같은 상황에서 어떤 방법)와 생성자 대 매개 변수없는 생성자에

과부하 해상도는 특이까지 제공됩니다. 다른 오버로드 확인 규칙의 무수한의 C# 4.0 언어 사양 (7.5.3.2 더 나은 기능 회원) 중 상태 :

그렇지 않으면 기본 인수에 대체 될 필요가있는 반면 MP의 모든 매개 변수는 해당 인수 이있는 경우 최소 하나의 MQ의 선택적 매개 변수 다음에 MP가 MQ보다 좋습니다.

이 정보를 통해 우리는 생성자에 대해 간단하게 질문 할 수 있습니다. new TestClass()라고 말하면 어느 것이 골라야합니까?

  1. 우리는 호출에 전달할 모든 인수를 지정했습니다. 이 경우 0입니다.

  2. 호출자에게 볼을 정확하게 제로 인수 생성자가 있습니까?

  3. 그렇다면, 그것을 호출합니다.

  4. 하지 않으면 차선책를 호출합니다. 이 경우 기본 인수가있는 생성자입니다.XmlSerializer를 이 규칙을 따르지 않는 것을

참고. 그것은 구체적으로 무엇을 원하는지 알고 당신이 그것을 제공하지 않으면 불평 할 것입니다.

관련 문제