위대한 코드를 작성했지만 왜 작동하는지 이해할 수 없습니다. 정수를 말하자면 클래스를 직렬화하고 싶습니다. 그래서 여기에 클래스 코드가 있습니다.기본 매개 변수를 가진 생성자와 조합 된 직렬화를위한 매개 변수없는 생성자입니다. 왜 작동합니까?
[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가 기본 매개 변수로 생성자를 확인하지 않는다는 것입니다. 하지만 컴파일러가이 코드를 허용하는 이유는 무엇입니까?
나는이 그냥 궁금뿐만 아니라, 배우고 더 좋은 일들이 내부적으로 어떻게 작동하는지 이해하기 바란다. 인터넷 검색은 유용한 검색어를 찾지 못했기 때문에 유용하지 않습니다.
"이제 같은 정의를 가진 두 개의 생성자가 없습니까?" - 같은 정의를 가진 두 개의 생성자가 보입니까? 나는하지 않는다. – AakashM
기본 인수를 사용하는 생성자는 nullary 생성자 (인수를 사용하지 않는 생성자)가 오버로드 된 것으로 보이므로 컴파일러가 불평하지 않았습니다. 또한 기본 인수가있는 생성자가 직렬화에 필요한 예상 생성자가 아닌 것 같습니다. 지금 발생하는 질문은 private 생성자를 protected로 만들고 suclass에서 새로운 TestClass()를 할 경우 어떤 생성자가 호출되는지입니다. – Diego
@Diego가 가장 일치하는 전화입니다. 이 경우 인수가 삽입 될 필요가 없으므로 기본 생성자가 가장 일치합니다. 다른 말로하면, 호출에 인수를 제공하지 않고 특정 생성자를 호출 할 방법이 없으므로 기본값은 중복됩니다. –