FubarBaz() мутирует элемент Foo.dependency
поэтому Foo
не является неизменным. Неизменность - это конструктивное ограничение, которое может и должно быть лучше выражено в C# путем маркировки полей readonly
. Связывание вашей зависимости может и должно выполняться в конструкторе (если вы делаете IoC, большинство фреймворков потребует этого). Неизменная конструкция может в конечном итоге, как это:
class Foo
{
private readonly IDependency dependency;
public Foo(IDependency dependency)
{
this.dependency = dependency;
dependency.Baz = "fubar";
}
}
Существует время и место для обоих изменяемых и неизменяемых конструкций класса. Возможно, значение часто меняется, а класс не разделяется, тогда работает изменяемый класс. Преимущество неизменности заключается в том, что он является инвариантным. Вы можете передать ссылку на объект вокруг и быть уверенным, что значение, которое оно указывает, никогда не изменяется. Это мощная концепция, особенно при работе с многопоточными приложениями.
Решение использовать статический класс должно основываться на том, как вы хотите, чтобы вызовы выглядели или вам абсолютно необходимо использовать статику, например, при создании методов расширения. IME, написание вызова перед выполнением вызова - отличный способ принять решение о дизайне перед подключением к реализации. Статика в основном такая же, как и нестатика, за исключением того, что статика не может быть «новой» (построенной вами). Статика не является неизменной, особенно потому, что вы их не строите. У вас только один экземпляр.
Я не вижу причин избегать типов возвращаемых ошибок при использовании методов в неизменном классе.
Ваш пример вроде нехорошо - у вас есть класс, который является единственной целью в жизни - это изменить какое-то состояние в экземпляре другого класса. Одна хорошая вещь в ООП заключается в том, что классы могут ограничивать сферу действия. – RossFabricant