saverioriotto.it

C# 10: Cosa c'è di nuovo?

C# 10 è stato rilasciato insieme a Visual Studio 2022 e .NET 6. Aggiunge diverse nuove funzionalità che rendono più semplice l'utilizzo. Ecco un tour di alcune delle aggiunte più utili e di come miglioreranno il tuo flusso di lavoro.

C# 10: Cosa c'è di nuovo?

Cominciamo con uno dei cambiamenti più semplici ma forse più significativi. Ora puoi applicare uno spazio dei nomi a un intero file tramite una nuova opzione di sintassi con la parola chiave namespace. Il codice rimanente all'interno del file verrà automaticamente assegnato al namespace, anche se non è incluso all'interno di un namespace. è file_scoped_namespace_declaration è costituito dalla parola chiave namespace, seguita da un nome dello spazio dei nomi, un punto e virgola e un elenco facoltativo di extern_alias_directives, using_directives e type_declarations.

namespace_declaration
    : 'namespace' qualified_identifier namespace_body ';'?
    ;
    
file_scoped_namespace_declaration
    : 'namespace' qualified_identifier ';' extern_alias_directive* using_directive* type_declaration*
    ;

In C# 9, era necessario il codice seguente per il namespace di una classe:

namespace Demo { 
    public class Example {
    } 
}

In C# 10, puoi invece semplificare come segue:

namespace Demo;
 
public class Example {
}

Ciò ti fa risparmiare spazio orizzontale nel tuo editor tagliando un livello di rientro. Se il file deve contenere più classi, puoi scriverle tutte a partire dalla colonna zero - la dichiarazione del namespace si applica all'intero file.

Utilizzo globale

Alcuni namespaces sono ampiamente utilizzati nei progetti. Tuttavia, è comunque necessario includerli manualmente in ogni file con l'istruzione using.

C# 10 lo cambia per supportare una variante global using. Ciò renderà il namespace di riferimento accessibile a tutti i file nel progetto.

global using System;

Gli utilizzi globali possono essere aggiunti a qualsiasi file che verrà incluso nella compilation. Supportano tutte le funzionalità dell'istruzione using standard, inclusa la parola chiave static e l'aliasing con "=" .

L'adozione di utilizzi globali ridurrà il numero di righe che scrivi, ma sono comunque meglio riservate ai namespace comunemente referenziati che presentano poche possibilità di denominare le collisioni. Fai attenzione perché fare affidamento su global using potrebbe rendere il tuo codice più opaco, poiché i nuovi contributori potrebbero non rendersi immediatamente conto di come è stata inclusa una risorsa nel namespace.

Una caratteristica complementare agli utilizzi globali è l'utilizzo implicito. Questo crea automaticamente l'istruzione global using appropriata per il tipo di progetto. La funzionalità è attivata per impostazione predefinita nei modelli di progetto .NET 6. Può essere disabilitato con l'impostazione ImplicitUsings nel tuo file .csproj.

Strutture migliorate

Gli struct hanno ricevuto diversi miglioramenti che li portano a una maggiore parità con le classi. Questi includono costruttori senza parametri, inizializzatori di campo, supporto completo per le with espression e la possibilità di creare strutture di record:

public record Point(int X, int Y);

Questo esempio crea una struttura di record "posizionale" in cui i parametri del costruttore X e Y diventano membri pubblici impliciti. Puoi anche definire manualmente i membri usando la sintassi esistente:

public record struct Point {
    public int X { get; init; }
    public int Y { get; init; }
}

Una struttura di record deve essere utilizzata negli scenari in cui è necessario incapsulare alcuni dati senza allegare comportamenti personalizzati come metodi di classe. Una struttura di record offre controlli di uguaglianza dei valori integrati e funzionalità come ToString(). Può essere mutabile o immutabile tramite la parola chiave readonly.

Miglioramenti dell'espressione Lambda

C# 10 aggiunge numerosi miglioramenti alle espressioni lambda che ne coprono i tipi e la sintassi. L'obiettivo è rendere le lambda più simili ai metodi regolari e alle funzioni locali. 

È stato introdotto il concetto di tipo “naturale”. Ciò consente al compilatore di dedurre un tipo lambda senza convertirlo manualmente in un delegato o in un'espressione. Questo crea un codice più leggibile quando si assegna un lambda a una variabile:

// C# 9
Func<string, int> toInt = (string s) => int.Parse(s);
 
// C# 10
var toInt = (string s) => int.Parse(s)

Il compilatore dedurrà il tipo di toInt as Func<string, int> ovviamente in Visual Studio. I tipi naturali funzioneranno solo quando l'espressione lambda è già completamente digitata. Se ometti i tipi di parametro, il compilatore non sarà in grado di creare una definizione di tipo compatibile.

Una modifica correlata è il supporto per i tipi restituiti espliciti. Come con una funzione normale, il tipo restituito va prima dell'elenco dei parametri di lambda:

var toInt = int (string s) => int.Parse(s)

Infine, i lambda ora possono accettare attributi allo stesso modo dei metodi e delle funzioni. Sono posizionati all'inizio dell'espressione lambda, prima del tipo restituito e dell'elenco dei parametri. Puoi utilizzare gli attributi per allegare metadati aggiuntivi per facilitare una maggiore introspezione e analisi del codice.

var toInt = [DemoAttribute()] int (string s) => int.Parse(s)

Assegnazioni Deconstructed versatile

Le assegnazioni di decostructed ora possono sia inizializzare nuove variabili che assegnare valori a quelle esistenti nella stessa riga. In precedenza era necessario utilizzare decostructed separate per questo tipo di operazioni.

In C# 9, il codice era simile al seguente:

int x = 0;
int y = 0;
(x, y) = point;
 
(int z) = point;

Mentre in C# 10, puoi farlo:

int x = 0;
int y = 0;
(x, y) = point;
 
(int z) = point;

Ora x, y e z verranno tutti inizializzati con valori utilizzando l'assegnazione di decostruciton singola, riducendo la ripetizione nel codice.

Altre modifiche

L'interpolazione delle stringhe è stata migliorata e ora funziona anche con stringhe costanti. È necessario assicurarsi che le ottimizzazioni del processo di interpolazione possono ridurre l'utilizzo della memoria e aumentare le prestazioni attraverso l'uso di gestori dedicati.

I modelli di proprietà sono stati semplificati per fornire un accesso più leggibile alle proprietà nidificate. Ora puoi utilizzare la sintassi del punto per accedere ai valori delle proprietà nidificate, invece di più livelli di parentesi:

// C# 9
{ Train: {ArrivalTime: "10:00"} }
 
// C# 10
{ Train.ArrivalTime: "10:00" }

Sono stati risolti diversi problemi di C# 9 che attivavano avvisi spuri in fase di compilazione, con controlli più accurati per aiutarti a eseguire il debug di problemi importanti. I problemi erano legati all'uso di espressioni di coalescenza nulle e confronti di variabili con costanti booleane.

Conclusione

C# 10 aggiunge diverse nuove funzionalità che aiuteranno a rendere lo sviluppo più semplice. Puoi iniziare a usare C# 10 scaricando Visual Studio 2022.  Disponibile anche come parte dell'SDK .NET 6 autonomo che funziona su Windows, Mac e Linux.




Commenti
* Obbligatorio