Metodi di estensione
Fa parte della sezione Programmazione orientata agli oggetti del percorso C# di Coddy. Lezione 39 di 70.
I metodi di estensione ti permettono di aggiungere nuovi metodi ai tipi esistenti senza modificarne il codice sorgente né creare classi derivate. Appaiono come se fossero metodi nativi del tipo, rendendo il tuo codice più leggibile e intuitivo.
Per creare un metodo di estensione, definisci un metodo statico in una classe statica, con il primo parametro preceduto dalla parola chiave this:
public static class StringExtensions
{
public static int WordCount(this string str)
{
return str.Split(' ').Length;
}
}Ora puoi chiamare questo metodo direttamente su qualsiasi stringa:
string sentence = "Hello World Today";
int count = sentence.WordCount(); // 3Il parametro this string str indica al compilatore che questo metodo estende il tipo string. Quando chiami sentence.WordCount(), il compilatore lo traduce dietro le quinte in StringExtensions.WordCount(sentence).
I metodi di estensione possono anche accettare parametri aggiuntivi:
public static bool IsLongerThan(this string str, int length)
{
return str.Length > length;
}
// Utilizzo
bool result = "Hello".IsLongerThan(3); // trueQuesta tecnica è usata ampiamente in LINQ, dove metodi come Where() e Select() sono metodi di estensione di IEnumerable. I metodi di estensione sono potenti per aggiungere funzioni di utilità a tipi che non controlli, mantenendo il tuo codice pulito ed espressivo.
Sfida
FacileCreiamo un insieme di metodi di estensione utili per gli interi, che aggiungono funzionalità comode che ti aspetteresti di trovare integrate. Creerai una classe statica contenente metodi di estensione che possono essere chiamati direttamente su qualsiasi intero, rendendo il tuo codice più espressivo e leggibile.
Organizzerai il codice in due file:
IntExtensions.cs: crea una classe statica chiamataIntExtensionsnello spazio dei nomiUtilities. Questa classe conterrà metodi di estensione che arricchiscono il tipoint:IsEven()- restituiscetruese il numero è pari, altrimentifalseSquare()- restituisce il numero moltiplicato per sé stessoIsInRange(int min, int max)- restituiscetruese il numero è compreso tra min e max (inclusi), altrimentifalse
thisper specificare il tipo che stai estendendo.Program.cs: nel file principale, leggi un intero dall'input e dimostra tutti e tre i metodi di estensione. Chiama ogni metodo direttamente sull'intero, come se fosse un metodo integrato, poi stampa i risultati.
Riceverai tre valori in input:
- Un numero da verificare (intero)
- Il valore minimo per il controllo dell'intervallo (intero)
- Il valore massimo per il controllo dell'intervallo (intero)
Stampa l'output in questo formato:
Is {number} even? {True/False}
Square of {number}: {result}
Is {number} in range [{min}-{max}]? {True/False}Per esempio, se i valori in input sono 7, 5 e 10, l'output dovrebbe essere:
Is 7 even? False
Square of 7: 49
Is 7 in range [5-10]? TrueNota quanto è naturale scrivere number.IsEven() e number.Square(): i metodi di estensione sembrano far parte da sempre del tipo intero!
Provalo tu
using System;
using Utilities;
class Program
{
public static void Main(string[] args)
{
// Leggi i valori di input
int number = Convert.ToInt32(Console.ReadLine());
int min = Convert.ToInt32(Console.ReadLine());
int max = Convert.ToInt32(Console.ReadLine());
// TODO: Usa i metodi di estensione su 'number' e stampa i risultati
// Chiama number.IsEven(), number.Square() e number.IsInRange(min, max)
// Stampa nel seguente formato:
// {number} è pari? {True/False}
// Quadrato di {number}: {result}
// {number} è nell'intervallo [{min}-{max}]? {True/False}
}
}
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