スポンサーリンク
※サイト運営にサーバーは必須です※
 ~ ロリポップ! 
はコスパのよい初心者向けサーバーです~
   
![]()
自動実装プロパティとは
自動実装プロパティは、以下のような形で記述されます。
データ型 プロパティ名 {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に対して値を入れることが可能です。
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。
