C# の自動実装プロパティの仕組み
C# 3.0 以降では自動実装プロパティ (auto-implemented properties) が導入されました。
それについては「C# の自動実装プロパティ」で説明しました。
とても便利な機能です。
便利はいいのですが、どこにデータが保存されるのかわからなくて、気持ち悪い、という風に感じられる方もいらっしゃるのではないでしょうか。
ここではそうした疑問に答えるべく、自動実装プロパティを用いた場合、内部でどのようにプロパティが実装されるのか確認しましょう。
自動的にバッキングフィールドが作成される
ひとことでいうと、自動実装プロパティを用いた場合、自動的にバッキングフィールドが作成されます。
「自動実装プロパティ」に書いた Person クラスを例にとると、 Person クラス内にはプライベートのバッキングフィールドが二つ作成されて、プロパティ(メソッド)を通して、それらに値をセットしたり、 値を取得できたりできるようになります。
ためしに ILDasm で Person クラスを見ると、次のようにフィールドが作成されていることが確認できます。
読み取り専用とした場合は、set メソッドが private 指定となる
また、private を付けてプロパティを読み取り専用とした場合は、いったいどのようになるのでしょうか。
こちらも ILDasm でコードを覗くと分かります。
読み取り、書き込み可能な場合は次のように、set メソッドが public 指定されています。
しかし、private をつけると、set メソッドが private 指定となります。
このため書き込み用のメソッドである set メソッドに外部からアクセスすることができないので、自動実装プロパティが読み取り専用となるわけです。