C# 中的屬性是類別的一種成員,提供存取該類別內資料的方式。呼叫端可以設定或取得(get)資料。屬性可以是自動實作,也可以有支援欄位。屬性由 set 存取子和/或 get 存取子組成。在其他某些語言中,「mutator」大致等同於 set 存取子,「accessor」則大致等同於 get 存取子,儘管兩者的語法組合方式完全不同。
設定屬性時,輸入值可以被驗證、格式化或以其他方式處理,事實上,只要是類別中程式碼能存取的任何程式化操作,都可以執行。
同樣地,取得屬性時,資料可以被計算或格式化,而且類別可用的任何程式化操作也都可以執行。
屬性和其他類別成員一樣具有存取修飾詞(如 public、private 等),但 set 存取子的存取層級可以獨立於取得(get)存取子,反之亦然。屬性不一定要同時具備兩個存取子,也可以只有其中一個(get 或 set)。
表達屬性的基本語法有兩種形式:
private int myField;
public int MyProperty
{
get { return myField; }
set { myField = value; }
}
public int MyProperty { get; private set; } = 42;
初始化並非必要。
在這個練習中,你將建立一台磅秤的模型,並以公斤作為單位。
這個練習共有 6 個任務,每個任務都需要你實作一或多個屬性:
為了滿足不同的需求,我們讓每台磅秤都能自訂精度(小數分隔符號後面的位數)。
實作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"