C# 中的属性是类的一个成员,用于访问该类内部的数据。调用方可以设置或获取(get)数据。属性既可以是自动实现的,也可以带有后备字段。属性由一个 set 访问器和一个/或一个 get 访问器组成。在其他一些语言中,“修改器”大致相当于 set 访问器,“访问器”大致相当于 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"