導入
以下のクラス「Sample01」を想定する。
public class Sample01 { public int a; }
変数aについて
- 読みこみ…クラスの内外から可能
- 書き換え…内部からのみ可能
である場合は関数を用いて、以下のようにすればいいと考えられる。
public class Sample01 { int a; public int GetA() { return a; } void SetA(int a) { this.a = a; } }
変数が増えた場合において、このような処理を行うとプログラムが長くなってしまう。ここで、プロパティというものを用いれば、簡潔に記述することができる。
プロパティを用いるメリット
1. 変数に対して、読み込みと書き込みの範囲を別々に設定できる。
変数の読み込みはクラス外部からも可能であるが、書き込みはクラス内部からのみという言うことが容易に実現できるようになる。
先ほどのクラス「Sample01」なら以下のように変更できる
public class Sample01 { public int A { get; private set; } }
2. 変数の代入に対して制約を与えられる。
変数に対して制約がある場合もプロパティが有効である。例えば次のプログラムではhpというint型変数を0~100しか設定できないようにできる。
public class Human { int hp; public int HP { get { return hp; } set { hp = value; if (hp < 0) hp = 0; else if (hp > 100) hp = 100; } } }
使用例
public class MainClass { public static void Main() { Human human = new Human(); human.HP = -2; Console.WriteLine($"-2を代入した場合:Hp= {human.HP}"); human.HP = 15; Console.WriteLine($"15を代入した場合:Hp= {human.HP}"); human.HP = 125; Console.WriteLine($"125を代入した場合:Hp= {human.HP}"); } }
実行結果
-2を代入した場合:Hp= 0 15を代入した場合:Hp= 15 125を代入した場合:Hp= 100
継承
プロパティは関数と同様に継承することが可能。
ただし、継承先でアクセシビリティの変更はできない点に注意。
using System; public abstract class BaseClass { public abstract int A { get; protected set; } } public class SubClass : BaseClass { int _a = 0; public SubClass(int a) { Console.WriteLine($"コンストラクタ"); A = a; } public override int A { get { Console.WriteLine($"Get A = {_a}"); return _a; } protected set { _a = value; Console.WriteLine($"Set A = {_a}"); } } } public class Hello { public static void Main() { SubClass sub = new SubClass(5); Console.WriteLine($"A = {sub.A}"); } }
実行結果
コンストラクタ Set A = 5 Get A = 5 A = 5
あとがき
プロパティを使用すると変数に対するアクセシビリティが明らかになるので、複数人での作業の場合は重宝しそうです。
また、変数に制約を加える作業はプロパティを使えば変数を書き換えるたびにif分を用いるということが無くなるので便利になりそうです。