【C#】.net frameworkでコンフィグファイルから設定値を簡単に利用する方法
プログラムを環境によって動きを変えたいときなど、
外部の設定ファイルに記述したいですね。
プログラムをコンパイルしなくても、ファイルを変更するだけで
動きを変えられるので便利です。
.net frameworkも他の言語やフレームワーク同様に
web.configやapp.configといった設定ファイルが用意されています。
設定値はファイル内のappSettingsのセクションに記述することで
利用できます。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
<appSettings>
<add key="IntKey" value="1"/>
</appSettings>
</configuration>
そして「ConfigurationManager」から呼び出して使います。
string IntKey =System.Configuration.ConfigurationManager.AppSettings["IntKey"];
「IntKey」は名前の通り、int型として使いたいのですが、
しかし、元がテキストデータゆえにstring型になっているため、
呼び出すごとにintに型変換しなくてはなりません。
それでは利便性が良くないです。
そこで、設定値に型を持たせ、利用時の手間を減らす方法を紹介したいと思います。
目次
クラスを用いて設定値に型を持たせる
設定値をクラスに持たせるために3つポイントを用意しました。
- 型を持たせたい
- 一箇所で管理したい
- 値を書き換えられたくない
それではコードです。
「型を持たせたい」、はプロパティ上でint変換することで解決しました。
これで利用時に型変換の手間を省けます。
「一箇所で管理したい」は、staticクラスを利用することで
複数箇所で管理されるのを防いでいます。
「値を書き換えられたくない」は、setを使用しないことで対応しました。
これで、書き換えられる心配はありません。
Nullチェックやデフォルト値を入れたい
これでクラスに型がある設定値を作ることができました。
しかし、Nullチェックやデフォルト値を入れたいという要望も
あるかもしれません。
そこで別のパターンも紹介します。
これはコンストラクタ「private AppConfig()」で
デフォルト値を入れている例になります。
コンストラクタを使う都合上、staticではなくなっていますね。
クラスの書き方は見慣れない類のコードではないでしょうか。
私自身、webとコンソールプログラムはいくつか作成しましたけれども、
この設定ファイル以外ではほぼ書かないです。
ともあれ、先ほどの3つの観点を確認していきましょう。
- 型を持たせたい
- 一箇所で管理したい
- 値を書き換えられたくない
「型を持たせたい」は、static同様プロパティには
型変換されたintが適用されているので大丈夫です。
「一箇所で管理したい」を実現するのに2つの特徴的な書き方をしています。
- プライベートのコンストラクタ
- 自分自身のインスタンスを自分のprivate staticプロパティで持つ
これによって、インスタンスを1つに制限することができます。
シングルトンといいます。
今回の例では
privateなコンストラクタなので外からnewできなくなっています。
では、newされるタイミングはといいますとプロパティ利用一回目です。
一回目の利用では、インスタンスがないためコンストラクタ呼び出されます。
プロパティの利用二回目以降は、すでにインスタンスがあるので新たにインスタンスはつくられません。
「値を書き換えられたくない」は、コンストラクタで値をsetしている都合上、setは必要なので「private set」を用いることで防ぎました。
続いて使い方です。
使い方に関してはstaticと同じですね。
そうすると、staticでできることを何故に複雑にして実装するのか、
という疑問がでてきます。
その理由は、柔軟なプロパティ設定は一回だけというメリットがあるからです。
類似のことは、staticクラスは「get」にif文を入れることで実現できます。
しかし、staticクラスは「get」するごとに
毎回if文で判定してしまいます。
対して、コンストラクタ利用は、最大1回が約束されていますので
回数という点では優れていますね。
まとめ
web.configやapp.configで設定した値を簡単に使うための方法は以上になります。
使うときに型を変換する必要もなくなりますのでお勧めです。
私自身は、判定の回数から、コンストラクタ利用にメリットを感じています。
しかし、作り方には違いがありますけれども、どちらも使い方は同じです。
まずは、作りやすそうと直感的に選んで試してはいかがでしょうか。