Вариант 1:
Fine. Именно то, что я бы использовал. Вы можете изменять содержимое виджета, но не сам виджет.
Вариант 2:
Нет. Нет. Вы сами не изменяете ссылку, поэтому вам не нужно использовать ref
. Если вы изменили саму ссылку (например, widget = new Widget()
, то out
/ ref
- правильный выбор, но по моему опыту это редко требуется.
Вариант 3:
Аналогичен варианту 1. Но может быть объединен в свободный интерфейс API. Лично мне это не нравится. Я использую эту подпись, только если я возвращаю копию и оставляю оригинальный объект без изменений.
Но самое главное, как вы назовете метод. В названии должно быть четко указано, что исходный объект мутирован.
Во многих ситуациях я бы выбрал вариант 4: сделать тип неизменным и вернуть копию. Но с виджетами, которые, очевидно, являются сущностями, а не ценностями, это не имеет смысла.