Membri con corpo di espressione
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 14 di 70.
I membri con corpo espressione offrono una sintassi concisa per i membri che contengono una sola espressione. Invece di scrivere i corpi completi di metodi o proprietà con le parentesi graffe, usi la sintassi a freccia =>.
Per i metodi che restituiscono una singola espressione, puoi sostituire l'intero corpo:
// Metodo tradizionale
public int Add(int a, int b)
{
return a + b;
}
// Metodo con corpo a espressione
public int Add(int a, int b) => a + b;Questa sintassi funziona anche per le proprietà di sola lettura, come hai già visto brevemente:
public class Circle
{
public double Radius { get; set; }
public double Area => Math.PI * Radius * Radius;
public double Circumference => 2 * Math.PI * Radius;
}Puoi anche usare corpi di espressione separatamente per i getter e i setter delle proprietà:
private string name;
public string Name
{
get => name;
set => name = value.Trim();
}Anche i costruttori possono usare questa sintassi quando contengono una singola istruzione:
public class Person
{
public string Name { get; }
public Person(string name) => Name = name;
}I membri con corpo espressione rendono il codice più leggibile quando la logica è semplice. Usali per operazioni semplici, ma attieniti ai corpi tradizionali quando hai bisogno di più istruzioni o di una logica complessa.
Sfida
FacileCreiamo un calcolatore dei prezzi dei prodotti che mostri la potenza dei membri con corpo espressione per scrivere codice pulito e conciso.
Creerai due file per organizzare il codice:
Product.cs: definisci una classeProductnello spazio dei nomiStore. Questa classe deve mostrare diversi membri con corpo espressione:- Una proprietà implementata automaticamente
Name(string) eBasePrice(decimal) - Un costruttore con corpo espressione che imposta entrambe le proprietà
- Una proprietà di sola lettura con corpo espressione
TaxAmountche calcola il 10% del prezzo base - Una proprietà di sola lettura con corpo espressione
TotalPriceche restituisce il prezzo base più l'importo dell'imposta - Un metodo con corpo espressione
GetDiscount(decimal percentage)che restituisce l'importo dello sconto (prezzo base moltiplicato per la percentuale e diviso per 100) - Un metodo con corpo espressione
GetFinalPrice(decimal discountPercentage)che restituisce il prezzo totale meno lo sconto
- Una proprietà implementata automaticamente
Program.cs: nel file principale, crea unProductusando i valori inseriti, quindi mostra il dettaglio dei prezzi.
Riceverai tre input:
- Nome del prodotto
- Prezzo base
- Percentuale di sconto da applicare
Stampa i dettagli dei prezzi in questo formato:
Product: {Name}
Base Price: {BasePrice}
Tax (10%): {TaxAmount}
Total Price: {TotalPrice}
Discount ({percentage}%): {discountAmount}
Final Price: {finalPrice}Ad esempio, se gli input sono Laptop, 1000 e 15, l'output dovrebbe essere:
Product: Laptop
Base Price: 1000.00
Tax (10%): 100.00
Total Price: 1100.00
Discount (15%): 150.00
Final Price: 950.00Formatta ogni valore monetario con esattamente due cifre decimali, ad esempio value.ToString("F2") o $"{value:F2}". Questo vale allo stesso modo per il prezzo base, l'imposta, il totale, lo sconto e il prezzo finale.
Ricorda di usare la sintassi della freccia => per tutti i membri che contengono una singola espressione. In questo modo il codice resterà pulito e leggibile!
Provalo tu
using System;
using Store;
class Program
{
public static void Main(string[] args)
{
// Leggi i valori di input
string name = Console.ReadLine();
decimal basePrice = Convert.ToDecimal(Console.ReadLine());
decimal discountPercentage = Convert.ToDecimal(Console.ReadLine());
// Crea un oggetto Product usando i valori di input
Product product = new Product(name, basePrice);
// Calcola l'importo dello sconto usando il metodo GetDiscount
decimal discountAmount = product.GetDiscount(discountPercentage);
// Calcola il prezzo finale usando il metodo GetFinalPrice
decimal finalPrice = product.GetFinalPrice(discountPercentage);
// Stampa i dettagli dei prezzi nel formato richiesto:
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}");
}
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniNamespace e direttiveIntroduzione a classi e oggettiLa parola chiave "this"Metodi e parametriCampi e proprietàCostruttoriInizializzatori di oggettiRiepilogo - Calcolatrice semplice4Ereditarietà
Sintassi di base dell'ereditarietà (:)La parola chiave 'base'Parole chiave virtual e overrideClassi sealedLa classe base 'object'Riepilogo - Gerarchia dei dipendenti7Funzionalità avanzate
Sovraccarico degli operatoriIndicizzatori (this[])Override di ToString()Metodi di estensioneRiepilogo - Lista personalizzata10Pattern di progettazione Parte 1
Introduzione ai pattern di progettazioneSingleton thread-safePattern FactoryPattern Observer (eventi)Pattern Strategy2Proprietà e membri statici
Proprietà implementate automaticamenteProprietà di sola lettura e di sola scritturaCampi e metodi staticiClassi staticheMembri con corpo di espressione5Polimorfismo e interfacce
Polimorfismo a compile time e runtimeInterfaccia o classe astrattaInterfacce multipleInterfacce espliciteUpcasting e downcastingRipasso: calcolatore di forme8Concetti avanzati di programmazione a oggetti
Composizione invece dell'ereditarietàTipi generici (classi e metodi)Delegati ed eventiAttributi e reflectionIDisposable e istruzione usingNozioni di base sull'iniezione delle dipendenze11Pattern di progettazione, parte 2
Pattern del ComandoPattern dell’AdattatorePattern del DecoratorePattern Template MethodPattern dello StatoPattern Composito3Architettura delle classi
Dati di istanza vs staticiParole chiave 'readonly' e 'const'Campi di supportoRiepilogo - Gestore di conti bancari6Incapsulamento
Modificatori di accessoProprietà per l'incapsulamentoImplementazione dell'occultamento dei datiModelli di immutabilitàRiepilogo - Registri degli studentiEsercitati da solo: Compilatore C# online