Я не могу вспомнить много случаев, когда значения по умолчанию действительно охватывают ... учитывая все различные варианты использования, через которые может проходить объект (не в последнюю очередь, такие вещи, как десериализация - которые могут в конечном итоге установить значения по умолчанию, даже если это не то, что было задумано).
Один из вариантов здесь - IoC; Контейнеры IoC, такие как StructureMap, имеют возможность устанавливать свойства после инициализации, а затем абстрагироваться от вызывающего кода.
Другим вариантом может быть какой-то экземпляр шаблона (статический), из которого экземпляры могут копировать значения. Но я думаю, что это рискованно в нескольких сценариях. Также возникают проблемы, если разные потоки (например, запросы на веб-сервере) требуют разных значений по умолчанию. [ThreadStatic]
не хороший вариант (хотя это вариант).
Другим вариантом (который обеспечивает наибольшую гибкость) будет предоставление настраиваемой пользователем фабрики ... возможно, с помощью делегата или механизма событий - но я изо всех сил пытаюсь понять, почему вам может понадобиться этот сценарий. Это не тот, кого я видел очень часто ...
re update: если он используется только внешним классом; может ли он использовать что-то вроде метода расширения (вместо того, чтобы Person
класс должен был что-то об этом знать):
public static class PersonExt {
public static void SetDefaults(this Person person) {
// your code
}
}
Поскольку это звучит так, как будто исходный класс Person
не заботится о SetDefaults
, это аккуратно отделяет логику от Person
.