У меня есть вопрос "передового опыта" об ООП в C # (но он вроде относится ко всем языкам).
Подумайте о том, чтобы иметь библиотечный класс с объектом, который должен быть открыт для публики, скажем, через средство доступа к свойству, но мы не хотим, чтобы публика (люди, использующие этот библиотечный класс) изменили его.
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
Очевидно, что лучшим подходом является «вариант C», но очень немногие объекты имеют вариант ReadOnly (и, конечно, ни один из пользовательских классов не имеет его).
Если бы вы были пользователем класса А, ожидали бы вы изменения
List<string> someList = ( new A() ).Items;
распространять на оригинальный (A) объект? Или можно вернуть клон при условии, что это было написано в комментариях / документации? Я думаю, что такой подход клонирования может привести к довольно трудным для отслеживания ошибкам.
Я помню, что в C ++ мы могли возвращать const-объекты, и вы могли вызывать только методы, помеченные как const. Я думаю, что нет такой функции / шаблон в C #? Если нет, то почему бы им не включить это? Я считаю, что это называется const правильность.
Но опять же, мой главный вопрос о том, «чего бы вы ожидали» или как справиться с вариантом А против Б.