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 Expression-bodied proporcionan una sintaxis concisa para miembros que contienen solo una sola expresión. En lugar de escribir cuerpos completos de métodos o propiedades con llaves, se utiliza la sintaxis de flecha =>.
Para métodos que devuelven una sola 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 propiedades de solo lectura, lo cual 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 getters y setters de las propiedades de forma individual:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Incluso los constructores pueden usar esta sintaxis cuando contienen una sola instrucción:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Los miembros Expression-bodied hacen que tu código sea más legible cuando la lógica es simple. Úsalos para operaciones sencillas, pero quédate con los cuerpos tradicionales cuando necesites múltiples sentencias o una lógica compleja.
Desafío
FácilVamos a construir una calculadora de precios de productos que demuestre 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 namespaceStore. Esta clase debe demostrar varios miembros con cuerpo de expresión:- Una propiedad auto-implementada
Name(string) yBasePrice(decimal) - Un constructor con cuerpo de expresión que configure ambas propiedades
- Una propiedad de solo lectura con cuerpo de expresión
TaxAmountque calcule el 10% del precio base - Una propiedad de solo lectura con cuerpo de expresión
TotalPriceque devuelva el precio base más el monto de impuestos - Un método con cuerpo de expresión
GetDiscount(decimal percentage)que devuelva el monto del descuento (precio base multiplicado por el porcentaje dividido entre 100) - Un método con cuerpo de expresión
GetFinalPrice(decimal discountPercentage)que devuelva el precio total menos el descuento
- Una propiedad auto-implementada
Program.cs: En tu archivo principal, crea unProductutilizando los valores de entrada y después muestra su desglose de precios.
Recibirás tres entradas:
- Nombre del producto
- Precio base
- Porcentaje de descuento a aplicar
Imprime los detalles del precio en 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.00Formatea cada valor monetario para que tenga exactamente dos decimales — por ejemplo value.ToString("F2") o $"{value:F2}". Esto aplica por igual al precio base, al impuesto, al total, al descuento y al 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 legible!
Pruébalo tú mismo
using System;
using Store;
class Program
{
public static void Main(string[] args)
{
// Leer las 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 estudiantes