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 com corpo de expressão 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 também funciona para propriedades somente leitura, 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 propriedades individualmente:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Até mesmo construtores podem usar esta sintaxe quando contêm uma única instrução:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Membros com corpo de expressão tornam seu código mais legível quando a lógica é simples. Use-os para operações diretas, mas continue com corpos tradicionais quando precisar de múltiplas instruções ou 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 classeProductno namespaceStore. Esta classe deve demonstrar vários membros com corpo de expressão:- Propriedades autoimplementadas
Name(string) eBasePrice(decimal) - Um construtor com corpo de expressão que define ambas as propriedades
- Uma propriedade somente leitura com corpo de expressão
TaxAmountque calcula 10% do preço base - Uma propriedade somente leitura com corpo de expressão
TotalPriceque retorna o preço base mais o valor do imposto - Um método com corpo de expressão
GetDiscount(decimal percentage)que retorna o valor do desconto (preço base multiplicado pela porcentagem dividido por 100) - Um método com corpo de expressão
GetFinalPrice(decimal discountPercentage)que retorna o preço total menos o desconto
- Propriedades autoimplementadas
Program.cs: No seu arquivo principal, crie umProductusando valores de entrada e, em seguida, exiba o detalhamento de seu preço.
Você receberá três entradas:
- Nome do produto
- Preço base
- Porcentagem de desconto a aplicar
Imprima os detalhes do preço neste formato:
Product: {Name}
Base Price: {BasePrice}
Tax (10%): {TaxAmount}
Total Price: {TotalPrice}
Discount ({percentage}%): {discountAmount}
Final Price: {finalPrice}Por exemplo, se as entradas forem Laptop, 1000, e 15, a saída deve ser:
Product: Laptop
Base Price: 1000
Tax (10%): 100
Total Price: 1100
Discount (15%): 150
Final Price: 950Lembre-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!
Folha de consulta
Membros com corpo de expressão usam a sintaxe de seta => para membros que contêm uma única expressão, fornecendo uma alternativa concisa aos corpos tradicionais de métodos e propriedades.
Métodos com corpo de expressão:
// 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;Propriedades somente leitura com corpo de expressão:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}Getters e setters de propriedades com corpo de expressão:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Construtores com corpo de expressão:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}Use membros com corpo de expressão para operações diretas. Para múltiplas instruções ou lógica complexa, use corpos tradicionais.
Experimente você mesmo
using System;
using Store;
class Program
{
public static void Main(string[] args)
{
// Ler as entradas
string name = Console.ReadLine();
decimal basePrice = Convert.ToDecimal(Console.ReadLine());
decimal discountPercentage = Convert.ToDecimal(Console.ReadLine());
// TODO: Criar um objeto Product usando os valores de entrada
// TODO: Calcular o valor do desconto usando o método GetDiscount
// TODO: Calcular o preço final usando o método GetFinalPrice
// TODO: Imprimir os detalhes de preço no formato exigido:
// Product: {Name}
// Base Price: {BasePrice}
// Tax (10%): {TaxAmount}
// Total Price: {TotalPrice}
// Discount ({percentage}%): {discountAmount}
// Final Price: {finalPrice}
}
}
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