Страницы

Поиск по вопросам

среда, 16 января 2019 г.

Не инициализировать объект без необходимости

Есть строка, в которой я заменяю значения.
Допустим, string str = "${1} ${2} ${3}"
Для замены на слова использую
if (str.Contains("${1}")) str = str.Replace("${1}", "один");
Однако, иногда встречаются такие замены, на которые нужен объект, который собирает нужную инфу. На это у него уходит большое кол-во времени.
QQ qq = getQQ(); if (str.Contains("${2}")) str = str.Replace("${2}", qq.first); if (str.Contains("${3}")) str = str.Replace("${3}", qq.second);
Соответственно, если такие замены не требуются, то и создавать и тратить время на объект qq не нужно.
Например, при работе приложения, какая-нибудь переменная типа int i = 1 не будет создана до тех пор, пока не понадобится в работе.
А можно сказать компилятору "молодой компилятор, не задействуй строку QQ qq = getQQ(); пока она не понадобится", или что-то типа того?


Ответ

(После дискуссии в комментариях изменил ответ)
Если создание объекта дорогое, вам нужно использовать ленивую инициализацию. Проще всего получить её при помощи класса Lazy
var lazyqq = new Lazy(getQQ, isThreadSafe: false); if (str.Contains("${2}")) str = str.Replace("${2}", lazyqq.Value.first); if (str.Contains("${3}")) str = str.Replace("${3}", lazyqq.Value.second);
Объект будет создан при первом его использовании.

Если в функцию нужно передать параметры, проще всего оформить это при помощи замыкания:
var lazyqq = new Lazy(() => getQQ(x, y, z), isThreadSafe: false);

Комментариев нет:

Отправить комментарий