У мене є питання "найкращих практик" щодо OOP в 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 (і, звичайно, не визначені користувачем класи).
Якщо ви були користувачем класу A, ви очікуєте змін
List<string> someList = ( new A() ).Items;
розповсюдження на оригінальний (A) об'єкт? Або добре повернути клона за умови, що це було написано в коментарях / документації? Я думаю, що цей клонний підхід може призвести до досить важко відслідковувати помилки.
Я пам’ятаю, що в C ++ ми могли повернути об’єкти const, і ви могли лише викликати методи, позначені як const на ньому. Я думаю, що в C # немає такої особливості / візерунка? Якщо ні, то чому б вони не включили його? Я вважаю, це називається коректністю коректності.
Але знову ж таки, моє головне питання - про те, «що б ви очікували» або як впоратися з варіантом A проти B.