Membros com Corpo de Expressão
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 14 de 70.
Membros de expressão corporificada (expression-bodied members) fornecem uma sintaxe concisa para membros que contêm apenas uma única expressão. Em vez de escrever corpos completos de métodos ou propriedades com chaves, você usa a sintaxe de seta =>.
Para métodos que retornam uma única expressão, você pode substituir o corpo inteiro:
// Método tradicional
public int Add(int a, int b)
{
return a + b;
}
// Método com corpo de expressão
public int Add(int a, int b) => a + b;Esta sintaxe funciona para propriedades somente leitura também, que você já viu brevemente:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}Você também pode usar corpos de expressão para getters e setters de propriedade individualmente:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Até mesmo construtores podem usar essa sintaxe quando contêm uma única instrução:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Expression-bodied members tornam seu código mais legível quando a lógica é simples. Use-os para operações diretas, mas mantenha os corpos tradicionais quando precisar de várias instruções ou de uma lógica complexa.
Desafio
FácilVamos construir uma calculadora de preços de produtos que demonstra o poder dos membros com corpo de expressão (expression-bodied members) para escrever um código limpo e conciso.
Você criará dois arquivos para organizar seu código:
Product.cs: Defina uma classeProductnonamespaceStore. Estaclassdeve demonstrar vários membros com corpo de expressão:- Propriedades auto-implementadas
Name(string) eBasePrice(decimal) - Um
constructorcom corpo de expressão que define ambas as propriedades - Uma propriedade somente leitura com corpo de expressão
TaxAmountque calcula 10% do preçobase - Uma propriedade somente leitura com corpo de expressão
TotalPriceque retorna o preçobasemais o valor do imposto - Um
methodcom corpo de expressãoGetDiscount(decimal percentage)que retorna o valor do desconto (preçobasemultiplicado porpercentagedividido por 100) - Um
methodcom corpo de expressãoGetFinalPrice(decimal discountPercentage)que retorna o preço totalminuso desconto
- Propriedades auto-implementadas
Program.cs: No seu arquivo principal, crie umProductusando valores deinpute, em seguida, exiba o detalhamento do preço.
Você receberá três inputs:
- Nome do produto
- Preço
base - Percentual de desconto a aplicar
Imprima os detalhes do preço neste format:
Product: {Name}
Base Price: {BasePrice}
Tax (10%): {TaxAmount}
Total Price: {TotalPrice}
Discount ({percentage}%): {discountAmount}
Final Price: {finalPrice}Por exemplo, se os inputs forem Laptop, 1000 e 15, a saída deve ser:
Product: Laptop
Base Price: 1000.00
Tax (10%): 100.00
Total Price: 1100.00
Discount (15%): 150.00
Final Price: 950.00Formate cada valor monetário para exatamente duas casas decimais — por exemplo, value.ToString("F2") ou $"{value:F2}". Isso se aplica ao preço base, ao imposto, ao total, ao desconto e ao preço final por igual.
Lembre-se de usar a sintaxe de seta => para todos os membros que contêm uma única expressão. Isso mantém seu código limpo e legível!
Experimente você mesmo
using System;
using Store;
class Program
{
public static void Main(string[] args)
{
// Ler entradas
string name = Console.ReadLine();
decimal basePrice = Convert.ToDecimal(Console.ReadLine());
decimal discountPercentage = Convert.ToDecimal(Console.ReadLine());
// Criar um objeto Product usando os valores de entrada
Product product = new Product(name, basePrice);
// Calcular o valor do desconto usando o método GetDiscount
decimal discountAmount = product.GetDiscount(discountPercentage);
// Calcular o preço final usando o método GetFinalPrice
decimal finalPrice = product.GetFinalPrice(discountPercentage);
// Imprimir os detalhes de preço no formato exigido:
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 lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos