Fondamenta OOP e Struttura
Namespace
Struttura C#Un "contenitore logico" che organizza e raggruppa classi affini, evitando conflitti di nomi tra parti diverse del programma o librerie esterne.
Il caso d'uso in MotoLogPro
Usando il C# moderno (file-scoped namespace) evito di indentare tutto il file. Raggruppo tutte le entità del database sotto MotoLogPro.Domain.Entities per mantenere l'architettura Clean e ordinata.
Modificatori di Accesso
Basi OOPParole chiave che definiscono la visibilità (chi può usare) di una classe, un metodo o una proprietà. Sono il primo strumento di Incapsulamento.
La regola d'oro
Principio del minimo privilegio: esponi sempre il meno possibile. Inizia con private, e allarga la visibilità solo quando strettamente necessario. Rende il codice più sicuro e manutenibile.
Classe (Class)
Basi OOPIl "progetto" o lo "stampo" da cui vengono creati gli oggetti in memoria. Raggruppa i dati (stato) e i metodi (comportamento). È un tipo riferimento: l'oggetto vive nell'heap e viene gestito dal Garbage Collector.
Il caso d'uso in MotoLogPro
Uso questa classe come entità fondamentale del dominio. Rappresenta la mappa nel codice di quello che diventerà una vera e propria tabella nel database relazionale.
Struct (Tipo Valore)
Struttura C#Simile alla classe, ma è un tipo valore: vive nello stack (più veloce) e viene copiato per valore ad ogni assegnazione. Ideale per dati piccoli, immutabili e ad alta frequenza di utilizzo.
Class vs Struct: quando scegliere?
Usa struct per dati piccoli (2-3 campi), immutabili e usati spesso (coordinate, colori, intervalli di tempo). Usa class per tutto il resto. In WalletWise potrei usare una struct Money per incapsulare importo + valuta senza overhead di allocazione.
Enum (Enumerazione)
Struttura C#Un tipo speciale che definisce un insieme di costanti con nome. Trasforma "numeri magici" o stringhe fragili in valori leggibili, tipizzati e sicuri a compile-time.
Il caso d'uso in MotoLogPro
Invece di salvare nel DB la stringa "benzina" (con tutti i rischi di typo), salvo il valore intero 0 e mappo l'enum via Entity Framework. Il codice è autodescrittivo e il compilatore mi avvisa subito se uso un valore inesistente.
Ereditarietà (Inheritance)
OOP: PilastroLa capacità di una classe (figlia) di assorbire e riutilizzare tutti i campi, le proprietà e i metodi di un'altra classe (genitore).
Il caso d'uso in MotoLogPro
Sfrutto la potenza del framework ASP.NET: ereditando da IdentityUser, la mia classe riceve gratis Email, Password, e sicurezza. Io aggiungo solo i campi extra che mi servono (Nome e Cognome).
Override (Polimorfismo)
OOP: PilastroPermette a una classe figlia di "sovrascrivere" il comportamento di un metodo ereditato dal genitore (marcato virtual) per personalizzarne il funzionamento.
Il caso d'uso in MotoLogPro
Nel ApplicationDbContext sovrascrivo questo metodo nativo di Entity Framework. Richiamo prima le logiche base del genitore con base.OnModelCreating, poi ci aggancio le mie configurazioni custom per le tabelle.
Classe Astratta (Abstract)
Basi OOPUna classe incompleta che non può essere istanziata direttamente (no new), ma funge da base concettuale obbligando altre classi a derivare da essa.
Il caso d'uso in MotoLogPro
Nelle mie API utilizzo ControllerBase, che è una classe astratta nativa di ASP.NET. Fornisce fondamenta robuste e metodi pronti all'uso per gestire le risposte HTTP.
Classe Sealed (Sigillata)
Basi OOPL'opposto dell'abstract: una classe marcata sealed non può essere ereditata da nessuna altra classe. È la versione finale, chiusa ad ogni estensione.
Perché usarla?
Sicurezza e performance. Il compilatore e il runtime sanno che non esiste alcuna classe derivata, quindi possono ottimizzare le chiamate ai metodi (no dispatch virtuale). Perfetta per servizi critici come la generazione di token JWT, dove l'ereditarietà incontrollata sarebbe un rischio.
Interfaccia (Interface)
Design / AstrazioneUn contratto rigoroso. Definisce quali metodi e proprietà una classe deve possedere, ma non dichiara mai come devono essere implementati.
Il caso d'uso in MotoLogPro
Separa il "cosa" dal "come". L'app sa che esiste un servizio per recuperare i veicoli (l'interfaccia), ma non le importa se questo li legge da un'API remota, da un database locale SQLite o da un file di testo (l'implementazione).
Static (Membro/Classe Statica)
Struttura C#Un membro static appartiene alla classe stessa, non a una sua istanza. Esiste uno e un solo esemplare di quel membro, condiviso da tutti gli oggetti e accessibile senza fare new.
Quando usarlo (e quando no)
Perfetto per classi di utilità pure (helper, costanti, extension methods). Da evitare per la logica di business: le classi statiche non sono iniettabili via DI, non sono mockabili nei test e creano dipendenze globali difficili da gestire.
Extension Methods
Struttura C#Permettono di "aggiungere" nuovi metodi a un tipo esistente (anche a quelli del framework come string o IEnumerable) senza modificarne il codice sorgente.
Il caso d'uso in MotoLogPro
Li utilizzo per registrare i servizi in MauiProgram.cs in modo ordinato. Invece di avere un file unico con 200 righe di builder.Services.Add..., creo metodi di estensione come services.AddMotoLogProServices() che raggruppano registrazioni correlate in file separati.
Classe Parziale (Partial)
Struttura C#Permette di dividere la definizione di una singola classe su più file fisici. Il compilatore unirà tutti i frammenti al momento della compilazione.
Il caso d'uso in MotoLogPro
Fondamentale in MAUI (MVVM). Grazie a partial, i Source Generators analizzano il mio codice e autogenerano centinaia di righe di boilerplate in un file nascosto, unendolo alla mia classe per magia.
Record
Struttura C#Tipo di dato reference (come la classe) pensato principalmente per incapsulare dati "immutabili" (che non cambiano dopo la creazione) in modo ultracompatto.
Il caso d'uso in MotoLogPro
Li utilizzo massicciamente per i DTO (Data Transfer Objects). Mi permettono di definire "pacchetti postali" usa-e-getta che viaggiano tra il client MAUI e le Web API con un'unica riga di codice pulitissima.
Campo (Field)
Basi OOPUna variabile dichiarata internamente alla classe. Per rispettare il principio di "Incapsulamento", si imposta come private (preceduto spesso da underscore _).
Il caso d'uso in MotoLogPro
Serve per mantenere uno stato interno accessibile solo alla classe stessa. Aggiungendo readonly mi assicuro che la connessione HTTP, una volta assegnata, non possa più essere alterata accidentalmente.
const vs readonly
Struttura C#Due modi per rendere un valore non modificabile, con una differenza cruciale: const è risolto a compile-time (valore noto subito), readonly è risolto a runtime (valore assegnato nel costruttore).
La regola pratica
Usa const per valori primitivi davvero fissi (stringhe di versione, limiti numerici). Usa readonly per qualsiasi dipendenza o oggetto iniettato via costruttore — è il pattern che usi in ogni AuthService o ViewModel.
Proprietà (Property)
Basi OOPFunge da "portinaio" per l'accesso ai dati. Permette di esporre un valore pubblico, controllandone la lettura (get) e la scrittura (set).
Il caso d'uso in MotoLogPro
Grazie al Toolkit MAUI uso l'attributo sul campo privato, che genera in automatico la Proprietà Pubblica. Il magico blocco set avvisa in tempo reale l'interfaccia grafica quando l'utente digita qualcosa.
Metodo (Method)
Basi OOPUn blocco di codice che racchiude una logica specifica o un'azione. Definisce il comportamento e "cosa sa fare" l'oggetto.
Il caso d'uso in MotoLogPro
Nelle Web API un metodo pubblico agganciato a un attributo [HttpGet] diventa un Endpoint: un "pulsante virtuale" che l'app mobile preme tramite internet per farsi inviare informazioni (es. la lista delle moto).
Delegati, Action e Func
Struttura C#Un delegato è un tipo che rappresenta un riferimento a un metodo (come un "puntatore a funzione" tipizzato). Action e Func sono delegati generici predefiniti in .NET che evitano di definire delegati custom.
La connessione con LINQ e Lambda
Sono il cuore di LINQ: ogni metodo come .Where(), .Select(), .OrderBy() accetta in realtà un Func come parametro. Quando scrivi una lambda x => x.Brand == "Yamaha", stai passando una Func<Vehicle, bool> in modo compatto.
Espressioni Lambda (=>)
Struttura C#Una sintassi compatta per definire funzioni anonime (senza nome) inline. Il simbolo => si legge "tale che" o "va in". Sono il modo moderno e conciso per passare logica come parametro.
Il caso d'uso in MotoLogPro
Ovunque ci sia LINQ, ci sono le lambda. Le uso per filtrare le moto per utente, per ordinare i log di manutenzione per data, o per trasformare le entità del DB nei DTO da inviare all'app mobile — tutto in poche righe leggibili e senza classi intermedie.
var (Inferenza di Tipo)
Struttura C#Parola chiave che lascia al compilatore il compito di dedurre automaticamente il tipo di una variabile dal valore assegnato. Non è "tipizzazione dinamica": il tipo è fisso e sicuro, determinato a compile-time.
La regola d'oro
Usa var quando il tipo è ovvio dalla parte destra dell'espressione (es. risultati di LINQ, new, metodi con nome descrittivo). Evitalo quando il tipo non è immediatamente chiaro per chi legge il codice dopo di te.
Generics <T>
Struttura C#Consentono di definire classi, metodi o interfacce "jolly", ritardando la specifica del tipo di dato (Type) finché non viene effettivamente utilizzato.
Il caso d'uso in MotoLogPro
C# è fortemente tipizzato (Type-Safe). Invece di avere un Task che restituisce "roba indefinita", i generics mi permettono di dire esattamente cosa ritornerà un'operazione asincrona, prevenendo errori già in fase di scrittura del codice.
Inizializzazione e flussi d'esecuzione
Costruttore Classico
Ciclo di VitaUn metodo speciale (avente lo stesso nome della classe) eseguito una sola volta, l'istante in cui l'oggetto prende vita (new). Prepara lo stato iniziale.
La logica Enterprise
Riceve in ingresso le "dipendenze" (come la connessione al web) passate dal sistema e le salva nei campi interni. Era lo standard assoluto fino a C# 11.
Costruttore Primario
C# 12L'evoluzione "leggera". Invece di scrivere il metodo del costruttore all'interno della classe, le dipendenze si dichiarano direttamente affianco al nome della classe.
Il caso d'uso in MotoLogPro
Abbatte vertiginosamente le righe di codice (boilerplate) da scrivere quando devo iniettare servizi ripetitivi nei miei ViewModel.
using / IDisposable
RisorseLo statement using garantisce che un oggetto che gestisce risorse esterne (file, connessioni DB, stream) venga sempre rilasciato correttamente al termine del blocco, anche in caso di eccezione.
La connessione con IDisposable
Qualsiasi classe che implementa l'interfaccia IDisposable espone un metodo Dispose() con la logica di pulizia. Lo statement using è semplicemente zucchero sintattico che chiama quel metodo in modo garantito — è l'alternativa sicura al ricordarsi di farlo a mano in un finally.
Nullable Types e Null Safety
Struttura C#C# distingue tra tipi che possono essere null (marcati con ?) e tipi che non lo possono essere. Con Nullable Reference Types abilitati, il compilatore avvisa quando rischi una NullReferenceException prima ancora di eseguire il codice.
Il caso d'uso in MotoLogPro
Con <Nullable>enable</Nullable> nel .csproj, il compilatore mi avvisa se provo ad accedere a una proprietà di un oggetto che potrebbe essere null. Ho eliminato decine di potenziali crash in produzione ancora prima di avviare l'app, solo seguendo i warning del compilatore.
Pattern Matching
FlussoUna sintassi potente per testare un'espressione non solo contro un valore, ma anche contro un tipo, una struttura o una condizione, estraendo direttamente le informazioni in un'unica operazione.
Il caso d'uso in MotoLogPro
Lo uso per mappare i codici di risposta HTTP delle Web API in messaggi leggibili, e per categorizzare i veicoli in base a più proprietà combinate senza if/else a cascata. Il codice risultante è più corto, privo di bug di break dimenticati e immediatamente leggibile.
LINQ (Language Integrated Query)
Flusso / DatiUn sistema di query integrato nel linguaggio che permette di filtrare, trasformare e aggregare qualsiasi collezione (liste, array, risultati DB) con una sintassi uniforme e leggibile, senza scrivere cicli for a mano.
Il caso d'uso in MotoLogPro
Con Entity Framework Core, LINQ non gira in memoria: viene tradotto in SQL ottimizzato e inviato al database. Scrivo codice C# tipizzato e leggibile, il framework si occupa di generare la query SQL corretta. Nessun SQL scritto a mano, zero rischi di SQL injection.
Metodo Asincrono (Async/Await)
FlussoUn blocco di codice progettato per avviare compiti "lenti" (API, DB, I/O) mettendo in attesa solo se stesso (tramite await), senza paralizzare il dispositivo dell'utente.
Il caso d'uso in MotoLogPro
Nelle app mobile è obbligatorio: permette al "thread della UI" di continuare a far girare l'animazione di caricamento mentre il sistema dialoga pazientemente col server web nel background.
CancellationToken
FlussoUn meccanismo cooperativo per segnalare a un'operazione asincrona che dovrebbe interrompersi. Non la ferma con la forza: il codice deve controllare il token e decidere quando fermarsi.
Perché è importante
Senza CancellationToken, se un utente naviga via da una pagina mentre una query è in esecuzione, il server continua a lavorare inutilmente sprecando risorse. Passando il token di ASP.NET Core alla query EF Core, la chiamata al DB viene annullata automaticamente se il client si disconnette.
yield return (Lazy Sequences)
FlussoPermette di costruire sequenze "pigre" (lazy): gli elementi vengono generati uno alla volta solo quando richiesti, senza creare una lista completa in memoria. Il metodo si "mette in pausa" ad ogni yield e riprende alla chiamata successiva.
Quando usarlo
Ideale per pipeline di dati, validazioni con più regole (restituisci gli errori uno alla volta), o quando lavori con sequenze potenzialmente infinite o molto grandi dove caricare tutto in memoria sarebbe costoso. In LINQ, molti operatori come .Where() e .Select() usano yield internamente — è per questo che LINQ è lazy per default.
Try-Catch-Finally
SicurezzaIl giubbotto antiproiettile per il codice. Tenta un'esecuzione (try), cattura eventuali esplosioni o errori inaspettati (catch), e assicura una pulizia finale (finally).
Il caso d'uso in MotoLogPro
Nota il catch when: permette di filtrare le eccezioni non solo per tipo ma anche per condizione, gestendo il 401 separatamente dagli altri errori di rete. Il finally spegne a prescindere l'indicatore di caricamento — anche se il catch stesso lancia un'eccezione.
Pattern architetturali e dati
Dependency Injection (DI)
ArchitetturaUn paradigma in cui una classe non "costruisce da sola" i suoi attrezzi (con new), ma li richiede in ingresso nel suo costruttore.
Il caso d'uso in MotoLogPro
È il cuore di .NET. Gestendo tutto il "magazzino attrezzi" (IoC Container) da un unico file, posso cambiare il motore del software senza toccare minimamente le pagine o le classi.
Data Annotations
EF Core"Etichette" speciali da applicare alle proprietà. Servono sia per la validazione automatica (Frontend) che per mappare lo schema del Database (Backend).
Il caso d'uso in MotoLogPro
Le uso nelle Entità del database WebAPI per dire con precisione ad Entity Framework Core che il telaio moto è obbligatorio e lungo max 17 caratteri, configurando contemporaneamente la chiave esterna per la tabella utente.
Tooling specifico e .NET MAUI
RelayCommand
MAUI / MVVMUn attributo del CommunityToolkit.Mvvm che converte in automatico un normale metodo C# in un Comando eseguibile direttamente al click di un bottone dall'interfaccia UI.
Il caso d'uso in MotoLogPro
Nel passato bisognava scrivere decine di righe extra creando una classe intera chiamata ICommand. Oggi basta questa riga e nello XAML della pagina ti basta agganciare Command="{Binding LoginCommand}"!
Navigazione Shell
MAUISecure Storage
MAUI Essent.API nativa multi-piattaforma del pacchetto "Essentials" per salvare piccoli pezzi di testo cifrati usando gli standard di massima sicurezza del sistema ospite.
Il caso d'uso in MotoLogPro
Lo sfrutto in AuthService.cs per salvare il token generato al login. Utilizza internamente la crittografia basata sul Keystore (Android) e sul Keychain (iOS). I dati salvati non sono visibili in nessun log o navigatore di file del dispositivo.
Nessun termine trovato
Prova con un termine diverso o rimuovi il filtro per tag.