Menu
Coddy logo textTech

Campos de respaldo

Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy. Lección 17 de 70.

Las propiedades implementadas automáticamente son convenientes, pero a veces necesitas tener más control sobre cómo una propiedad almacena o recupera su valor. Ahí es donde entran en juego los campos de respaldo. Un campo de respaldo es un campo privado que almacena los datos reales de una propiedad.

public class Product
{
    private decimal _price;  // Campo de respaldo
    
    public decimal Price
    {
        get { return _price; }
        set { _price = value; }
    }
}

Esto parece un trabajo extra en comparación con las auto-propiedades, pero los campos de respaldo permiten añadir lógica. Por ejemplo, puedes validar los datos antes de almacenarlos:

public class Product
{
    private decimal _price;
    
    public decimal Price
    {
        get => _price;
        set => _price = value < 0 ? 0 : value;
    }
}

Ahora los precios negativos se convierten automáticamente en cero. También puedes transformar datos al leer o escribir, registrar cambios o activar otras acciones.

La convención de nomenclatura del campo de respaldo suele usar un prefijo de guion bajo (_price) o minúsculas (price) para distinguirlo de la propiedad.

Cuando usas propiedades autoimplementadas como public decimal Price { get; set; }, el compilador crea en realidad un campo de respaldo oculto para ti. Los campos de respaldo explícitos te brindan el mismo almacenamiento con un control total sobre el comportamiento.

challenge icon

Desafío

Fácil

Construyamos un sistema de sensor de temperatura que use campos de respaldo para validar y transformar los datos al almacenarlos y recuperarlos.

Crearás dos archivos para organizar tu código:

  • TemperatureSensor.cs: Define una clase TemperatureSensor en el espacio de nombres Sensors. Este sensor mide la temperatura en Celsius, pero debemos asegurarnos de que las lecturas se mantengan dentro de límites válidos. Usa campos de respaldo para implementar lo siguiente:
    • Una propiedad Location (string) con un campo de respaldo _location. Al establecer la ubicación, si el valor es nulo o está vacío, almacena "Unknown" en su lugar.
    • Una propiedad Temperature (double) con un campo de respaldo _temperature. Al establecer la temperatura, limita el valor entre -50 y 150 (si es menor que -50, almacena -50; si es mayor que 150, almacena 150).
    • Una propiedad de solo lectura TemperatureFahrenheit que calcula y devuelve la temperatura en Fahrenheit usando la fórmula: (celsius * 9 / 5) + 32. Esto debe usar directamente el campo de respaldo.
    • Un constructor que acepte los valores de ubicación y temperatura inicial.
  • Program.cs: En tu archivo principal, crea un sensor usando valores de entrada y muestra sus lecturas. Después, actualiza la temperatura con un segundo valor de entrada y muestra las lecturas actualizadas.

Recibirás tres entradas:

  • Ubicación del sensor
  • Lectura de temperatura inicial
  • Lectura de temperatura actualizada

Imprime la salida con este formato:

Sensor: {Location}
Temperature: {Temperature}C ({TemperatureFahrenheit}F)
Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)

Por ejemplo, si las entradas son Lab Room, 25 y 200, la salida debería ser:

Sensor: Lab Room
Temperature: 25C (77F)
Updated Temperature: 150C (302F)

Observa cómo la segunda lectura de 200 se limita a 150 porque supera la temperatura máxima válida. ¡Tus campos de respaldo te proporcionan este control sobre cómo se almacenan los datos!

Pruébalo tú mismo

using System;
using Sensors;

class Program
{
    public static void Main(string[] args)
    {
        // Leer entradas
        string location = Console.ReadLine();
        double initialTemp = Convert.ToDouble(Console.ReadLine());
        double updatedTemp = Convert.ToDouble(Console.ReadLine());

        // TODO: Crear un TemperatureSensor con la ubicación y la temperatura inicial

        // TODO: Imprimir la ubicación del sensor y las lecturas de temperatura inicial
        // Formato: "Sensor: {Location}"
        // Formato: "Temperature: {Temperature}C ({TemperatureFahrenheit}F)"

        // TODO: Actualizar la temperatura del sensor con el valor actualizado

        // TODO: Imprimir las lecturas de temperatura actualizadas
        // Formato: "Updated Temperature: {Temperature}C ({TemperatureFahrenheit}F)"
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de C# online