Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > .NET FAQ > Settings - что, где и как


Автор: PIL 21.03.08, 08:50
Часто возникает задача хранить какие-то данныев конфигах, потом быстро и безболезненно их читать, перечитывать, изменять.
Все это очень удобно делать с помощью появившегося с .NET 2.0 средства - Settings.
Добавить их в проект просто - Add new Item - Settings. В моем примере, я дал им красивое и наглядное имя - MySettings :)
Нажмем OK, и что же произошло? А вот что:
1. Появилось 3 новых файла:
MySettings.Designer.cs
MySettings.settings
MySettings.cs
2. В проекте появился новый член команды - MySettings.settings, если кликнуть по которому, появится красивый дизайнер, с помощью которого можно добавлять свои свойства для хранения.
Каждое свойство содержит следующие критерии:
Name - наименование свойства класса и секции конфига
Type - тип данных (от простых типов, до собственных, лишь бы сериализоваться умели)
Scope - тип хранения и доступа к свойству. Имеет 2 значения - User, Application, на них я остановлюсь попозже.
Value - значение свойства (будет использоваться как значение по умолчанию)

Создадим 2 тестовых свойства:
NameTypeScopeValue
MyDateDateTimeUserлюбая дата
MyStringstringApplication"какая то строка"


Что при этом происходит:
Волшебным образом в проект добавился app.config (если не был до этого), видим в нем следующее:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                <section name="ConsoleApplication3.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
            </sectionGroup>
            <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
                <section name="ConsoleApplication3.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
            </sectionGroup>
        </configSections>
        <userSettings>
            <ConsoleApplication3.MySettings>
                <setting name="MyDate" serializeAs="String">
                    <value>2008-03-21</value>
                </setting>
            </ConsoleApplication3.MySettings>
        </userSettings>
        <applicationSettings>
            <ConsoleApplication3.MySettings>
                <setting name="MyString" serializeAs="String">
                    <value>какая то строка</value>
                </setting>
            </ConsoleApplication3.MySettings>
        </applicationSettings>
    </configuration>

Я думаю для тех, кто понимает xml - коментарии излишни

Теперь зайдем в класс дизайнера и видим следующие сгеренированные нам свойства:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    [global::System.Configuration.UserScopedSettingAttribute()]
            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.Configuration.DefaultSettingValueAttribute("2008-03-21")]
            public global::System.DateTime MyDate {
                get {
                    return ((global::System.DateTime)(this["MyDate"]));
                }
                set {
                    this["MyDate"] = value;
                }
            }
            
            [global::System.Configuration.ApplicationScopedSettingAttribute()]
            [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
            [global::System.Configuration.DefaultSettingValueAttribute("какая то строка")]
            public string MyString {
                get {
                    return ((string)(this["MyString"]));
                }
            }

Видно, что свойство Application Scope - есть только get, то есть его можно только читать, а User scope - есть get и set - можно читать и писать.
Кроме этого видим установленные нами свойсва по умолчанию аттрибутами DefaultSettingValueAttribute. Хочу обратить внимание, что значения user scope свойств не хранятся в app.config, он не переписывается при вызове метода Save(), все данные хранятся в домашнем каталоге пользователя. Это значит что если в ОС есть пользователи Петя и Вася, они оба пользуются написанной нами программой - у них будут общие Default значения, а сохраненные значения User scope - у каждого свои.

Использование наших наработок:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    static void Main(string[] args)
            {
                MySettings settings = new MySettings(); //создаю с дефолтовыми значениями
                settings.Reload();  //перечитываю из конфига реальные
                string myStr = settings.MyString;   //достаю из конфига реальное значение
                settings.MyDate = DateTime.Now; //устанавливаю новое значение для User Scope
                settings.Save();    //сохраняю значения свойств User Scope
            }

В аттаче архив с проектом, нужно переименовать расширение
Удачи в использовании, вопросы приветствуются :)

Автор: Alexus 21.03.08, 10:05
От себя добавлю, что есть возможность создать "стандартные настройки проекта" - для этого надо зайти в свойства проекта, перейти там на вкладку Settings - и кликнуть на ссылку в центре появившейся страницы.

Ещё тонкость - все созданные вами конфиги будут хранить свои настройки в одном и том же в файле App.config проекта.

Добавлено
Цитата PIL @
MySettings settings = new MySettings(); //создаю с дефолтовыми значениями
settings.Reload(); //перечитываю из конфига реальные

это можно сделать чуть короче, написав
MySettings.Default

Автор: freeway 29.11.09, 13:41
очень нужная вещь, а можно добавить (удалить) свойство программно, а не в дизайнере?

Автор: Alexus 09.12.09, 07:31
Можно, но для этого свойства не появится ацессора (типа Properties.Settings.Default.MyPropName).
Придётся читать и писать в это свойство через индексатор, используя строковое имя свойства.
Добавлять так: Properties.Settings.Default.Properties.Add("MyPropName");
Читать\писать так: var value = Properties.Settings.Default["MyPropName"];

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)