Miembros con cuerpo de expresión
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy. Lección 14 de 70.
Los miembros con cuerpo de expresión proporcionan una sintaxis concisa para los miembros que contienen solo una expresión. En lugar de escribir cuerpos completos de métodos o propiedades con llaves, usas la sintaxis de flecha =>.
Para los métodos que devuelven una única expresión, puedes reemplazar todo el cuerpo:
// Método tradicional
public int Add(int a, int b)
{
return a + b;
}
// Método con cuerpo de expresión
public int Add(int a, int b) => a + b;Esta sintaxis también funciona para las propiedades de solo lectura, que ya has visto brevemente:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}También puedes usar cuerpos de expresión para los captadores y establecedores de propiedades individualmente:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Incluso los constructores pueden usar esta sintaxis cuando contienen una única instrucción:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Los miembros con cuerpo de expresión hacen que tu código sea más legible cuando la lógica es simple. Úsalos para operaciones sencillas, pero mantén los cuerpos tradicionales cuando necesites varias instrucciones o una lógica compleja.
Desafío
FácilConstruyamos una calculadora de precios de productos que muestre el poder de los miembros con cuerpo de expresión para escribir código limpio y conciso.
Crearás dos archivos para organizar tu código:
Product.cs: Define una claseProducten el espacio de nombresStore. Esta clase debe demostrar varios miembros con cuerpo de expresión:- Una propiedad implementada automáticamente
Name(string) yBasePrice(decimal) - Un constructor con cuerpo de expresión que establece ambas propiedades
- Una propiedad de solo lectura con cuerpo de expresión
TaxAmountque calcula el 10 % del precio base - Una propiedad de solo lectura con cuerpo de expresión
TotalPriceque devuelve el precio base más el importe del impuesto - Un método con cuerpo de expresión
GetDiscount(decimal percentage)que devuelve el importe del descuento (el precio base multiplicado por el porcentaje y dividido entre 100) - Un método con cuerpo de expresión
GetFinalPrice(decimal discountPercentage)que devuelve el precio total menos el descuento
- Una propiedad implementada automáticamente
Program.cs: En tu archivo principal, crea unProductusando valores de entrada y, después, muestra el desglose de su precio.
Recibirás tres entradas:
- Nombre del producto
- Precio base
- Porcentaje de descuento que se aplicará
Imprime los detalles del precio con este formato:
Product: {Name}
Base Price: {BasePrice}
Tax (10%): {TaxAmount}
Total Price: {TotalPrice}
Discount ({percentage}%): {discountAmount}
Final Price: {finalPrice}Por ejemplo, si las entradas son Laptop, 1000 y 15, la salida debería ser:
Product: Laptop
Base Price: 1000.00
Tax (10%): 100.00
Total Price: 1100.00
Discount (15%): 150.00
Final Price: 950.00Da formato a cada valor monetario con exactamente dos decimales, por ejemplo value.ToString("F2") o $"{value:F2}". Esto se aplica por igual al precio base, el impuesto, el total, el descuento y el precio final.
Recuerda usar la sintaxis de flecha => para todos los miembros que contengan una sola expresión. ¡Esto mantiene tu código limpio y fácil de leer!
Pruébalo tú mismo
using System;
using Store;
class Program
{
public static void Main(string[] args)
{
// Leer entradas
string name = Console.ReadLine();
decimal basePrice = Convert.ToDecimal(Console.ReadLine());
decimal discountPercentage = Convert.ToDecimal(Console.ReadLine());
// Crear un objeto Product usando los valores de entrada
Product product = new Product(name, basePrice);
// Calcular el monto del descuento usando el método GetDiscount
decimal discountAmount = product.GetDiscount(discountPercentage);
// Calcular el precio final usando el método GetFinalPrice
decimal finalPrice = product.GetFinalPrice(discountPercentage);
// Imprimir los detalles de precios en el formato requerido:
Console.WriteLine($"Product: {product.Name}");
Console.WriteLine($"Base Price: {product.BasePrice:F2}");
Console.WriteLine($"Tax (10%): {product.TaxAmount:F2}");
Console.WriteLine($"Total Price: {product.TotalPrice:F2}");
Console.WriteLine($"Discount ({discountPercentage}%): {discountAmount:F2}");
Console.WriteLine($"Final Price: {finalPrice:F2}");
}
}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
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantesPractica por tu cuenta: Compilador de C# online