Страницы

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

пятница, 3 января 2020 г.

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

#c_sharp


Есть строка, в которой я заменяю значения.

Допустим, 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();
пока она не понадобится", или что-то типа того?
    


Ответы

Ответ 1



(После дискуссии в комментариях изменил ответ) Если создание объекта дорогое, вам нужно использовать ленивую инициализацию. Проще всего получить её при помощи класса 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);

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

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