アプリケーション設定 (Application Settings)

設定値の追加

ソリューション エクスプローラーでプロジェクトのプロパティを開き、そこにある[設定]ペインで追加できます。

スコープ (Scope)

設定にはスコープという項目がありますが、これは次のように使い分けます。

スコープ 用途 プログラムによる書き換え 保存場所
アプリケーション (Application) アプリケーション単位 不可 実行ファイルと同じフォルダの AppName.exe.config
ユーザー (User) ユーザー単位 可能 %LOCALAPPDATA%Namespace\folder\Version\user.config
アプリケーション設定を活用するには?[2.0のみ、C#、VB] - @IT 一色政彦 (2007/02/22)

ユーザー スコープの実際の保存場所は、

System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(
    System.Configuration.ConfigurationUserLevel.PerUserRoamingAndLocal);

string filePath = config.FilePath;

とすることで確認できます。ConfigurationManager.OpenExeConfiguration メソッド (ConfigurationUserLevel) (System.Configuration) | MSDN

設定値からの取得

次の書式のプロパティから取得できます。

global::Namespace.Properties.Settings.Default.Name

既定値の取得

Settingsクラス内からのみアクセスできます。

string settingValue =
    Settings.defaultInstance.Properties[ "SettingName" ].DefaultValue.ToString();

StringCollection

複数の文字列はStringCollectionクラスで、XML形式で格納されます。

System.Xml.XmlDocument document = new System.Xml.XmlDocument();
document.LoadXml( Settings.defaultInstance.Properties[ "SettingName" ].DefaultValue.ToString() );

foreach( System.Xml.XmlElement element in document.DocumentElement )
{
    string data = element.InnerText;
}

取得した設定値の検証

バージョンアップの影響などで無効な値が取得される可能性を考慮するならば、アプリケーション設定の取得時に値の検証を行います。それにはプロジェクトのプロパティにある設定デザイナ (Settings designer) で、[コードの表示]をクリックします。C# で設定を使用する | MSDN

するとSettings.csというファイル名で、次のようなSettingクラスが表示されます。

// このクラスでは設定クラスでの特定のイベントを処理できます:
//  SettingChanging イベントは、設定値が変更される前に発生します。
//  PropertyChanged イベントは、設定値が変更された後に発生します。
//  SettingsLoaded イベントは、設定値が読み込まれた後に発生します。
//  SettingsSaving イベントは、設定値が保存される前に発生します。
internal sealed partial class Settings {

    public Settings() {
        // 設定の保存と変更のイベントハンドラを追加するには、以下の行のコメントを解除します:
        //
        // this.SettingChanging += this.SettingChangingEventHandler;
        //
        // this.SettingsSaving += this.SettingsSavingEventHandler;
        //
    }

    private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
        // SettingChangingEvent イベントを処理するコードをここに追加してください。
    }

    private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
        // SettingsSaving イベントを処理するコードをここに追加してください。
    }
}

アプリケーション設定の読み込み時に処理するには、ここでSettingsLoadedイベントのハンドラを定義します。

internal sealed partial class Settings
{
    public Settings()
    {
        this.SettingsLoaded += new System.Configuration.SettingsLoadedEventHandler( Settings_SettingsLoaded );
    }

    private void Settings_SettingsLoaded( object sender, System.Configuration.SettingsLoadedEventArgs e )
    {
        // 値を検証する
        if( this.settingValue < 1.0 )
        {
            // 既定値を設定する
            this.settingValue = Double.Parse(
               Settings.defaultInstance.Properties[ "SettingName" ].DefaultValue.ToString() );
        }
    }
}

設定値への設定

global::Namespace.Properties.Settings.Default.Sample = 123;

設定値の保存

Properties.Settings.Default.Save()を呼びます。

public override void Save()
ApplicationSettingsBase.Save メソッド (System.Configuration) | MSDN

前バージョンの設定値の引き継ぎ

アプリケーション設定はアプリケーションのバージョンごとに異なるフォルダに保存されるため、通常ではバージョンアップ時に設定は引き継がれません。もし設定を引き継ぐようにしたいならば、ApplicationSettingsBaseのUpgrade()メソッドを呼び出します。ApplicationSettingsBase.Upgrade メソッド (System.Configuration) | MSDN

Properties.Settings.Default.Upgrade();

またバージョンアップしたとき、初回の起動時にのみ設定を引き継ぐようにするには、更新したことを示すフラグをアプリケーション設定に記録しておきます。アプリケーション設定の Upgrade について - MSDN フォーラム

MSDN (Microsoft Developer Network) から検索