Прочитать значение несколько раз или сохранить как переменную в первый раз? - PullRequest
5 голосов
/ 02 февраля 2011

Как правило, лучше хранить значение в переменной при первом запуске или постоянно использовать значение? Код объяснит это лучше:

TextWriter tw = null;
if (!File.Exists(ConfigurationManager.AppSettings["LoggingFile"]))
{
   // ...
   tw = File.CreateText(ConfigurationManager.AppSettings["LoggingFile"]);
}

или

TextWriter tw = null;
string logFile = ConfigurationManager.AppSettings["LoggingFile"].ToString();
if (!File.Exists(logFile))
{
    // ...
    tw = File.CreateText(logFile);
}

Ответы [ 6 ]

4 голосов
/ 02 февраля 2011

Ясность важна, и СУХОЙ (не повторяйся) важна. Это микроабстракция, скрывающая небольшую, но все же значительную часть функциональности за переменной. Производительность незначительна, но положительное влияние ясности не может быть преуменьшено. Используйте переменную с хорошим именем для хранения значения после его получения.

0 голосов
/ 02 февраля 2011

IMO, это будет зависеть от того, что вы пытаетесь кэшировать.Кэширование параметра из App.conig может быть не таким полезным (кроме читабельности кода), как кэширование результатов вызова веб-службы через соединение GPRS.

0 голосов
/ 02 февраля 2011

Я должен согласиться с другими. Читаемость и СУХОЙ важны, а стоимость переменной очень низкая, учитывая, что часто вы будете иметь только объекты и не будете хранить вещи несколько раз.

Могут быть исключения со специальными или большими объектами. Вы должны иметь в виду вопрос, может ли значение, которое вы кэшируете, измениться между ними, и если вы хотите или нет (чаще всего второе!) Знать новое значение в вашем коде! В вашем примере подумайте, что может произойти, когда ConfigurationManager.AppSettings ["LoggingFile"] изменяется между двумя вызовами (из-за логики или потока аксессора или всегда читая значение из файла с диска).

Резюме: Около 99% вам понадобится второй метод / кеш!

0 голосов
/ 02 февраля 2011

Я почти уверен, второй более читабелен. Но если говорить о производительности - не оптимизировать на ранних стадиях и без профилировщика.

0 голосов
/ 02 февраля 2011

Второй будет лучшим выбором.

Представьте себе следующую ситуацию. Настройки обновляются другими потоками, и во время некоторых из них, поскольку значение настройки не заблокировано, оно изменяется на другое значение.

В первой ситуации ваше выполнение может завершиться сбоем, или оно будет выполнено нормально, но код проверял файл с каким-либо именем, а затем сохраняет все, что не было проверено ранее. Это очень плохо, не правда ли?

Еще одно преимущество - вы не получаете значение дважды. Вы получаете один раз, и вы используете, где ваш код должен прочитать весь параметр.

0 голосов
/ 02 февраля 2011

2-е решение лучше для меня, потому что:

  • поиск по словарю имеет стоимость
  • это более читабельно

Или вы можете иметь одноэлементный объект с его частным конструктором, который заполняет все необходимые данные конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...