У мене є дивна звичка, здається ... щонайменше, за словами мого колеги. Ми разом працювали над невеликим проектом. Я написав класи (спрощений приклад):
[Serializable()]
public class Foo
{
public Foo()
{ }
private Bar _bar;
public Bar Bar
{
get
{
if (_bar == null)
_bar = new Bar();
return _bar;
}
set { _bar = value; }
}
}
Отже, я в основному ініціалізую будь-яке поле лише тоді, коли викликається геттер, а поле все ще є нульовим. Я вважав, що це зменшить перевантаження, не ініціалізуючи жодних властивостей, які ніде не використовуються.
ETA: Причиною цього я є те, що мій клас має кілька властивостей, які повертають екземпляр іншого класу, який, у свою чергу, також має властивості з ще більшою кількістю класів тощо. Виклик конструктора до вищого класу згодом викликає всіх конструкторів для всіх цих класів, коли вони не завжди потрібні.
Чи є заперечення проти цієї практики, окрім особистих уподобань?
ОНОВЛЕННЯ: Я розглянув багато різних думок щодо цього питання і буду стояти за свою прийняту відповідь. Однак зараз я прийшов до набагато кращого розуміння концепції і я в змозі вирішити, коли її використовувати, а коли ні.
Мінуси:
- Питання безпеки нитки
- Не підпорядковується запиту "setter", коли передане значення є нульовим
- Мікрооптимізація
- Обробка винятків повинна відбуватися в конструкторі
- Потрібно перевірити на предмет null в класі класу
Плюси:
- Мікрооптимізація
- Властивості ніколи не повертаються до нуля
- Затримати або уникати завантаження "важких" предметів
Більшість мінусів не застосовні до моєї поточної бібліотеки, проте мені доведеться перевірити, чи "мікрооптимізація" насправді щось оптимізує.
ОСТАННЄ ОНОВЛЕННЯ:
Гаразд, я змінив свою відповідь. Моє первісне питання полягав у тому, чи це хороша звичка чи ні. І я зараз переконаний, що це не так. Можливо, я все-таки буду використовувати його в деяких частинах свого поточного коду, але не безумовно і точно не весь час. Тому я втрачу звичку і подумаю про це, перш ніж її використовувати. Дякую всім!