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 única expresión. En lugar de escribir cuerpos completos de métodos o propiedades con llaves, se utiliza la sintaxis de flecha =>.
Para los métodos que devuelven una sola expresión, puedes reemplazar el cuerpo completo:
// 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, 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 getters y setters de 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 con cuerpo de expresión hacen que su código sea más legible cuando la lógica es sencilla. Úselos para operaciones directas, pero mantenga los cuerpos tradicionales cuando necesite múltiples sentencias o lógica compleja.
Desafío
FácilVamos a construir un calculador 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 auto-implementada
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 monto del impuesto - Un método con cuerpo de expresión
GetDiscount(decimal percentage)que devuelve el monto del descuento (precio base multiplicado por el porcentaje dividido por 100) - Un método con cuerpo de expresión
GetFinalPrice(decimal discountPercentage)que devuelve el precio total menos el descuento
- Una propiedad auto-implementada
Program.cs: En tu archivo principal, crea unProductutilizando los valores de entrada, luego muestra el desglose de su precio.
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
Tax (10%): 100
Total Price: 1100
Discount (15%): 150
Final Price: 950¡Recuerda usar la sintaxis de flecha => para todos los miembros que contengan una sola expresión. Esto mantiene tu código limpio y legible!
Hoja de referencia
Los miembros con cuerpo de expresión utilizan la sintaxis de flecha => para miembros que contienen una sola expresión, proporcionando una alternativa concisa a los cuerpos de métodos y propiedades tradicionales.
Métodos con cuerpo de expresión:
// 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;Propiedades de solo lectura con cuerpo de expresión:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}Getters y setters de propiedades con cuerpo de expresión:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Constructores con cuerpo de expresión:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Utilice miembros con cuerpo de expresión para operaciones sencillas. Para múltiples sentencias o lógica compleja, utilice cuerpos tradicionales.
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());
// TODO: Crear un objeto Product usando los valores de entrada
// TODO: Calcular el monto del descuento usando el método GetDiscount
// TODO: Calcular el precio final usando el método GetFinalPrice
// TODO: Imprimir los detalles de precios en el formato requerido:
// Product: {Name}
// Base Price: {BasePrice}
// Tax (10%): {TaxAmount}
// Total Price: {TotalPrice}
// Discount ({percentage}%): {discountAmount}
// Final Price: {finalPrice}
}
}
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