スポンサーリンク
※サイト運営にサーバーは必須です※
~このサイトもエックスサーバーを使用しています~
自動実装プロパティとは
自動実装プロパティは、以下のような形で記述されます。
データ型 プロパティ名 {get; set;}
以下のようにフィールドとプロパティが記述されたコードがあった場合を考えます。
private int _num;
public int Num
{
get { return _num; }
set { _num = value; }
}
自動実装プロパティがあった場合、以下のように簡潔に書くことができます。
public int Num { get; set; }
自動実装プロパティを使えば、値を格納するためのフィールドを明示的に用意する必要がなくなります。(この場合、_numに相当するフィールドを明示的に宣言する必要がありません)
ここで、勘違いして欲しくない点として、プロパティ自体に値が格納されているわけではありません。
あくまで、プロパティは値をやり取りする際の窓口でしかありません。
では、値はどこに格納されるでしょうか?
正解は、「バッキングフィールド」に格納されます。
「バッキングフィールド」は、自動実装プロパティを用意した際に、自動実装されるフィールドです。
バッキングフィールドをプロパティ以外の手段でアクセスすることはできません。
※Visual Studioを使っている場合、prop+「Tab」+「Tab」と打つと、以下のコードが素早く書けます(コードスニペット)。自動実装を頻繁に使うのなら、知っておくと便利です。
public int MyProperty { get; set; }
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Property14 { class Program { static void Main(string[] args) { MyClass mc = new MyClass(); mc.Num = 20; Console.WriteLine(mc.Num); } } class MyClass { //自動実装プロパティ public int Num { get; set; } //自動実装プロパティに相当する動きをする↓ //private int _num; //public int Num //{ // get { return _num; } // set { _num = value; } //} //自動実装プロパティに相当する動きをする↑ } } |
実行結果
20
初期値設定
C#6.0から自動実装プロパティに対して、初期値を設定できるようになりました。
データ型 プロパティ名 {get; set;}=値;
例
public int MyProperty { get; set; } = 10;
自動実装プロパティの注意点
通常のプロパティを記述する場合は、getアクセサーとsetアクセサーの片方のみの記述が許されています。
しかし、自動実装プロパティの場合getアクセサーを省略することはできません。(getアクセサーのみは可能、setアクセサーのみは不可能)
※もし仮に、setアクセサーで値を設定できたとしても、getアクセサーがないと、バッキングフィールドから値を取り出せない。
getアクセサーのみあるプロパティを一度作った場合、読み取り専用プロパティとして振舞うので、初期値の設定以降は値の変更が不可能に見えます。しかし、実は、コンストラクターでの初期化は有効です。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Property13 { class Program { static void Main(string[] args) { MyClass mc1 = new MyClass(); Console.WriteLine(mc1.Num); MyClass mc2 = new MyClass(30); Console.WriteLine(mc2.Num); } } class MyClass { //コンストラクター public MyClass() { } //コンストラクター public MyClass(int i) { Num = i; } //プロパティ public int Num { get; } = 5; } } |
実行結果
5
30
プロパティNumに対して、初期の値を5と設定しています。
しかし、インスタンス化の際に、コンストラクターを通して、Numに対して値を入れることが可能です。
~Webサイトを自分で作ってみませんか?~
Webサイトを運営するにはサーバーが必須です。
このサイトは、エックスサーバー のサーバーを使用しています。
エックスサーバーは無料で10日間お試しができます。