后备字段
本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 17 课,共 70 课。
自动实现的属性很方便,但有时你需要更好地控制属性如何存储或获取其值。这时就需要后备字段。后备字段是用于存储属性实际数据的私有字段。
public class Product
{
private decimal _price; // 后备字段
public decimal Price
{
get { return _price; }
set { _price = value; }
}
}与自动属性相比,这看起来多了一些工作,但后备字段可以让你添加逻辑。例如,你可以在存储数据前验证数据:
public class Product
{
private decimal _price;
public decimal Price
{
get => _price;
set => _price = value < 0 ? 0 : value;
}
}现在,负价格会自动变为零。你还可以在读取或写入数据时转换数据、记录更改或触发其他操作。
后备字段命名约定通常会使用下划线前缀(_price)或小写形式(price),以便与属性区分。
使用 public decimal Price { get; set; } 这样的自动实现属性时,编译器实际上会为你创建一个隐藏的后备字段。显式后备字段能提供相同的存储空间,同时让你完全控制其行为。
挑战
简单让我们构建一个温度传感器系统,使用支持字段在数据存储和读取时进行验证和转换。
你将创建两个文件来组织代码:
TemperatureSensor.cs:在Sensors命名空间中定义一个TemperatureSensor类。这个传感器测量摄氏温度,但我们需要确保读数保持在有效范围内。使用支持字段实现以下功能:- 一个
Location属性(字符串),并使用支持字段_location。设置位置时,如果值为 null 或空字符串,则改为存储"Unknown"。 - 一个
Temperature属性(double),并使用支持字段_temperature。设置温度时,将值限制在-50到150之间(低于 -50 时存储 -50,高于 150 时存储 150)。 - 一个只读属性
TemperatureFahrenheit,使用公式(celsius * 9 / 5) + 32计算并返回华氏温度。这个属性应直接使用支持字段。 - 一个接受位置和初始温度值的构造函数。
- 一个
Program.cs:在主文件中,使用输入值创建一个传感器并显示其读数。然后使用第二个输入值更新温度,并显示更新后的读数。
你将收到 3 个输入:
- 传感器位置
- 初始温度读数
- 更新后的温度读数
按以下格式打印输出:
Sensor: {Location}
Temperature: {Temperature}C ({TemperatureFahrenheit}F)
Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)例如,如果输入是 Lab Room、25 和 200,输出应为:
Sensor: Lab Room
Temperature: 25C (77F)
Updated Temperature: 150C (302F)请注意,第二个读数 200 会被限制为 150,因为它超过了有效温度的上限。支持字段让你可以控制数据的存储方式!
亲手试试
using System;
using Sensors;
class Program
{
public static void Main(string[] args)
{
// 读取输入
string location = Console.ReadLine();
double initialTemp = Convert.ToDouble(Console.ReadLine());
double updatedTemp = Convert.ToDouble(Console.ReadLine());
// TODO: 使用位置和初始温度创建 TemperatureSensor
// TODO: 输出传感器的位置和初始温度读数
// 格式:"Sensor: {Location}"
// 格式:"Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
// TODO: 用更新后的值更新传感器的温度
// TODO: 输出更新后的温度读数
// 格式:"Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器