Предложение об использовании файла конфигурации приложения близко, но есть две проблемы с ним.
Во-первых, все пользователи приложения используют один и тот же файл конфигурации приложения. Если у вас несколько пользователей (скажем, в сети или у разных пользователей на одном компьютере), сохранение предпочтений пользователя в файле конфигурации приложения изменит этот параметр для всех пользователей. Второе, что не так с этим, заключается в том, что при установке по умолчанию в Vista он все равно не будет работать: по умолчанию Vista не предоставляет пользователю права на запись в каталог Program Files
, поэтому сохраняются изменения в файле конфигурации приложения. выдаст исключение.
Правильный ответ - использовать пользовательские настройки. Они хранятся в файле пользовательских настроек приложения, который находится в подкаталоге (глубоко вложенном и зависящем от версии ОС) домашнего каталога пользователя. ConfigurationManager
загружает эти настройки во время выполнения и позволяет вам обновлять и сохранять их в своем коде. В Visual Studio встроена целая инфраструктура, которая делает это (относительно) простым, и это хорошо, потому что для правильного выполнения этой задачи необходимо написать ужасный код для класса ConfigurationManager
. Вот как это работает:
Если вы загляните под Свойства вашего проекта VS, вы увидите элемент с именем Settings.settings
. Когда вы дважды щелкните по нему, он покажет вам сетку, которая позволит вам добавить настройки в ваш проект. Вы даете имя параметра, выбираете его тип данных и значение по умолчанию, и, что особенно важно, область действия. Параметр может быть областью приложения, в этом случае его значение будет общим для всех пользователей приложения и будет сохранено в файле конфигурации приложения. Или это может быть пользовательская область, в этом случае каждый пользователь может иметь свое собственное значение для настройки, и настройка будет жить в файле пользовательских настроек.
Когда вы добавляете настройку в эту сетку, VS генерирует код, чтобы сделать настройку доступной для вашего кода. По сути, он создает класс, который предоставляет эти параметры вашему коду в качестве свойств одноэлементного объекта. (Вы можете увидеть этот код, если хотите получить представление о том, что избавляет вас от необходимости делать это самостоятельно; он сохраняется в файле «Settings.Designer.cs», созданном в «Settings.settings» в представлении проекта. Также удобно восстанавливать этот класс каждый раз, когда вы меняете информацию в сетке настроек. После того, как вы создали параметр в сетке настроек, вы можете ссылаться на него в своем коде таким образом:
ctl.BackColor = Properties.Settings.Default.BackColor;
Настройки пользователя могут быть изменены вашим кодом:
Properties.Settings.Default.BackColor = newBackColor;
И вы можете сохранить их в файле пользовательских настроек следующим образом:
Properties.Settings.Default.Save();
Наличие этих настроек в качестве свойств класса полезно по многим причинам. Одним из наиболее важных является то, что, поскольку они являются свойствами (а не, скажем, словарными записями, доступ к которым осуществляется по ключу, как работает большинство кодов, написанных людьми против класса ConfigurationManager
), проверка имен во время компиляции вы используете в коде. Вы никогда не получите NullReferenceException
во время выполнения, если вы ошиблись в названии параметра; вместо этого вы получите сообщение об ошибке.
Есть несколько тонкостей в использовании пользовательских настроек. Один из менее очевидных: что происходит, когда вы выпускаете новую версию программного обеспечения? Пользовательские настройки хранятся в каталоге, который привязан к номеру версии программы; Если вы выпустите новую версию, файл пользовательских настроек для нее не будет существовать. Как вы удерживаете пользователя от потери всех своих настроек при обновлении вашей программы?
Это также встроено в этот класс Settings
; все, что вам нужно сделать, это:
if (Properties.Settings.Default.UpgradeSettings)
{
Properties.Settings.Default.Upgrade();
Properties.Settings.Default.UpgradeSettings = false;
}
Это скопирует настройки пользователя из предыдущего выпуска в файл настроек для нового выпуска.