Menu
CoddyTech

后备字段

本课属于 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; } 这样的自动实现属性时,编译器实际上会为你创建一个隐藏的后备字段。显式后备字段能提供相同的存储空间,同时让你完全控制其行为。

challenge icon

挑战

简单

让我们构建一个温度传感器系统,使用支持字段在数据存储和读取时进行验证和转换。

你将创建两个文件来组织代码:

  • 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)"
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C# 在线编译器