スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
目次
プロパティとは
プロパティは、クラスの外部からフィールドにアクセスするときの窓口になります。
そのため、プロパティとフィールドはセットで使われることが多いです。
プロパティの基本形
プロパティの最も基本的な書き方は以下のようになります。
アクセス修飾子 データ型 プロパティ名
{
get { returnフィールド; }
set { フィールド= value; }
}
プロパティは、getアクセサーとsetアクセサーという2つのサクセサーから構成されています。
プロパティの値を知りたいときに、getアクセサーが呼び出されます。
逆に、プロパティに値を設定するときに、setアクセサーが呼び出されます。
※プロパティを使用する側から見ると、あたかも、プロパティに値が代入されているように見えます。しかし、プロパティを定義しても、値を記憶する領域は確保されません。実際の値は、setアクセサーを通してフィールドに格納されています。
※setアクセサーのvalueという引数を通じて、ユーザーの入力した値をやり取りします。
ソースコード
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 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Property04 { class Program { static void Main(string[] args) { MyClass mc = new MyClass(); //エラー(_ageのアクセスレベルはprivateのため) //mc._age = 10; mc.Age = 10;//setアクセサーが呼び出される Console.Write("年齢は"); Console.WriteLine(mc.Age);//getアクセサーが呼び出される } } class MyClass { //フィールド private int _age; //プロパティ public int Age { get { return _age; } set { _age = value; } } } } |
実行結果
年齢は10
もしも、プロパティがなかったら?
フィールドの値をクラスの外部から自由にアクセスして欲しくないことがあります。
そのような場合、普通ならプロパティを使います。
もしも、プロパティという概念を持ち出さずに、フィールドの値を管理したいという状況を考えます。
これを解決するには、メソッドでやり取りすることが考えられます。
しかし、メソッドでプロパティと同じ機能を実現するには、以下の点がネックになります。
・値を書き込む用(set)と値を読み取る用(get)の2つメソッドを用意しないといけない。
・クラスを使う側が、フィールドに直接値を入れるような感覚で扱えない(メソッドであることを意識してしまう)
ソースコード
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 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Property05 { class Program { static void Main(string[] args) { MyClass mc = new MyClass(); mc.SetAge(10);//SetAgeメソッドを呼び出す Console.Write("年齢は"); Console.WriteLine(mc.GetAge());//GetAgeメソッドを呼び出す } } class MyClass { private int _age; public void SetAge(int i) { _age = i; } public int GetAge() { return _age; } } } |
実行結果
年齢は10
SetAgeメソッドとGetAgeメソッドの2つのメソッドが必要です。
プロパティの応用例
ここで、一番最初のソースコードを見返してみましょう。
よくよく考えたら、わざわざプロパティを書く必要がないのではないかと思われた方がいるかもしれません。
たしかにそうです。
以下のソースコードは、お好きに_ageにアクセスしてくださいと言っているようなものです。
private int _age;
public int Age {
get { return _age; }
set { _age = value; }
}
そのため、プロパティを使わず、次のようにフィールドのみ使って書いても同じ働きをします。
public int Age;
もう少し、プロパティのありがたみのわかる例を考えましょう。
プロパティが真価を発揮するのは、何らかの形でアクセスを制限したい場合やフィールドに入る値を制御したい場合です。
ここでは、_ageの値に、負の値が入いりそうな場合、警告を出して、0に置き換えるようなコードを考えましょう。
ソースコード
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 38 39 40 41 42 43 44 45 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Property06 { class Program { static void Main(string[] args) { MyClass mc = new MyClass(); mc.Age = 10; Console.Write("年齢は"); Console.WriteLine(mc.Age); mc.Age = -5; Console.Write("年齢は"); Console.WriteLine(mc.Age); } } class MyClass { private int _age; public int Age { get { return _age; } set { if (value > 0) { _age = value; } else { Console.WriteLine("値が不正です"); _age = 0; } } } } } |
実行結果
年齢は10
値が不正です
年齢は0
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。