55381


タイトルの件、app.config（*exe.config）に型付きの値（settings）を設定後、*exe.configに不正な値を設定した場合、どのような値が設定値として取得できますか？

以下の場合の動きがしりたいです。  
1.型の異なる値を設定（例えばint型で定義したのに英文字を設定）  
→取得に失敗して2と同じになりますか？  
2.項目値を削除  
→取得出来なかった場合、デフォルト値（settingsに書かれた値）になりますか？


CC BY-SA 4.0
2019-05-30T13:42:08.973
55376
2019-05-31T01:06:57.467
9228
question
c#
app.configに不正な値を設定した場合の挙動について


それ以前の問題として、`app.config`がXMLとして不正な状態（閉じタグが一致しない、ファイルが空など）な場合に例外が投げられます。  
ですので、質問のような個別のパターンに対応するのではなく、根本的なエラー対策が必要です。


CC BY-SA 4.0
2019-05-30T22:02:31.417
55378
2019-05-30T22:02:31.417
4236
55376
answer


一応XMLとして有効な範囲で編集された場合は、ご質問のようにデフォルト値になるでしょう。

プログラム・初期configはVisualStudioのIDEで、プロジェクトのプロパティの「設定」タブで定義し、`Properties`の`Settings.Settings`(Settings.Designer.cs)および`app.config`に格納され、ビルドして正常に動作し、*.exe.configだけ編集するものとします。  
例としては以下のようになります。

Settings.Designer.cs

[code]

    [global::System.Configuration.ApplicationScopedSettingAttribute()]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute("99")]
    public int Key1 {
        get {
            return ((int)(this["Key1"]));
        }
    }
    
[/code]

app.config

[code]

    <applicationSettings>
      <ConsoleApp1.Properties.Settings>
        <setting name="Key1" serializeAs="String">
          <value>99</value>
        </setting>
      </ConsoleApp1.Properties.Settings>
    </applicationSettings>
    
[/code]

Program.cs

[code]

    Console.WriteLine("Setting Key1 : {0}", Properties.Settings.Default.Key1);
    
[/code]

* * *

1.型の異なる値を設定（例えばint型で定義したのに英文字を設定）  
→取得に失敗して2と同じになりますか？

答：以下のような範囲の編集ならば、デフォルト値が取得されます。

[code]

          <value>ZZ等</value>
    
          <value></value>
    
          <value />
    
[/code]

2.項目値を削除  
→取得出来なかった場合、デフォルト値（settingsに書かれた値）になりますか？

答：以下のような範囲の編集ならば、デフォルト値が取得されます。  
以下の部分全体を削除

[code]

        <setting name="Key1" serializeAs="String">
          <value>99</value>
        </setting>
    
[/code]

nameの値を定義していないものに変更

[code]

        <setting name="KeyXX" serializeAs="String">
          <value>99</value>
        </setting>
    
[/code]

例外：以下のように<value>99</value>の部分を削除すると例外になります。

[code]

        <setting name="Key1" serializeAs="String">
        </setting>
    
[/code]


CC BY-SA 4.0
2019-05-31T01:06:57.467
55381
2019-05-31T01:06:57.467
26370
55376
answer