C#のプロパティは、クラスのメンバーであり、そのクラス内のデータへのアクセスを提供します。呼び出し側は、データを設定したり取得(get)したりできます。プロパティは、自動実装にするか、バッキングフィールドを持つことができます。プロパティは、setアクセサーまたはgetアクセサー、あるいはその両方で構成されます。他の言語では、「mutator」がsetアクセサーに、「accessor」がgetアクセサーにほぼ相当しますが、構文の構成はまったく異なります。
プロパティを設定するときには、入力値を検証したり、整形したり、その他の方法で操作したりできます。実際、クラス内のコードからアクセスできるあらゆるプログラム的操作を実行できます。
同様に、プロパティを取得するときには、データを計算したり整形したりできます。ここでも、クラスで利用できるあらゆるプログラム的操作を実行できます。
プロパティは、他のクラスメンバーと同じようにアクセス修飾子(public、privateなど)を持ちますが、setアクセサーは、取得(get)アクセサーとは独立したアクセスレベルを持てますし、その逆も同様です。プロパティは必ずしも両方のアクセサーを持つ必要はなく、片方(getまたはset)だけでもかまいません。
プロパティを表す基本的な構文には、2つの形があります。
private int myField;
public int MyProperty
{
get { return myField; }
set { myField = value; }
}
public int MyProperty { get; private set; } = 42;
初期化は省略できます。
この演習では、キログラムを単位とするはかりをモデル化します。
6つのタスクがあり、それぞれで1つ以上のプロパティを実装する必要があります。
さまざまな要求に応えるため、各はかりを精度(小数点以下の桁数)でカスタマイズできるようにします。
WeighingMachineクラスに、取得専用のPrecisionプロパティを実装し、コンストラクターのprecision引数で設定します。
var wm = new WeighingMachine(precision: 3);
// => wm.Precision == 3
WeighingMachine.Weightプロパティを実装し、重さを取得_および_設定できるようにします。
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.5;
// => wm.Weight == 60.5
言うまでもなく、重さが負になることはありえません。
WeighingMachine.Weightプロパティに検証を追加し、負の重さを設定しようとしたときにArgumentOutOfRangeExceptionをスローするようにします。
var wm = new WeighingMachine(precision: 3);
wm.Weight = -10; // Throws an ArgumentOutOfRangeException
風袋調整には任意の値(負の値や、表示重量が負になるような値でもかまいません)を指定できます。
WeighingMachine.TareAdjustmentプロパティを実装し、風袋調整を設定できるようにします。
var wm = new WeighingMachine(precision: 3);
wm.TareAdjustment = -10.6;
// => wm.TareAdjustment == -10.6
入念にテストした結果、製造上の問題により、すべてのはかりが重さを5だけ過大に見積もる傾向があることがわかりました。
WeighingMachine.TareAdjustmentプロパティのデフォルト値を5に変更します。
var wm = new WeighingMachine(precision: 3);
// => wm.TareAdjustment == 5.0
WeighingMachine.DisplayWeightプロパティを実装します。このプロパティは、風袋調整後の重さを、正しい精度を適用し、単位を付けた文字列として返す必要があります。
次の点に注意してください。
display-weight = input-weight - tare-adjustment
var wm = new WeighingMachine(precision: 3);
wm.Weight = 60.567;
wm.TareAdjustment = 10;
// => wm.DisplayWeight == "50.567 kg"