В целом у нас есть инициализация по умолчанию в первом случае и инициализация значения во втором случае.
, Например: в случае, если с интервалом (тип POD):
int* test = new int
- у нас есть любая инициализация и значение *, тест может быть любым.
int* test = new int()
- *тест будет иметь 0 значений.
следующее поведение зависело от Вашей проверки печатания. У нас есть почтительные случаи: Тест имеет defult конструктора, Тест генерировали конструктора по умолчанию, Тест содержат участника POD, не участника POD...
protobuf-net в настоящее время зависит от наличия конструктора без параметров для работы.
Однако этот конструктор не обязательно должен быть общедоступным ( он будет использовать отражение, если потребуется его вызвать ), поэтому вы можете определите требуемый частный конструктор только для использования protobuf-net (добавив комментарий о том, почему) и решите там конкретные проблемы, связанные с сериализацией.
Это не дает остальной части вашего api создавать «незаконные» экземпляры.
Марк указывает, что если вы говорите о внешнем объекте сообщения, вы также можете создать объект самостоятельно и вызвать Serializer.Merge. Но если ему нужно создать объект (потому что он в настоящее время имеет пустой экземпляр или для новых элементов в списке / массиве), тогда он ищет конструктор по умолчанию.
ShuggyCoUk прав насчет использования конструктора без параметров.
Но для полноты картины - если вы говорите о самом внешнем объекте сообщения , вы также можете создать возразите себе и вызовите Serializer.Merge
. Но если ему нужно создать объект (поскольку он в настоящее время имеет экземпляр null
или для новых элементов в списке / массиве), он ищет конструктор по умолчанию.
Я полагаю , что я мог бы также предоставить некоторую разметку в атрибуте, чтобы сказать «просто создайте необработанный объект через FormatterServices
», но это кажется ненужным (по сравнению с частным конструктором без параметров) и может не работать на всех платформы (Silverlight, CF и т. д. - вероятные проблемы).