Le novità di C# 9

di Cristian Civera, in .NET 5,

Con l'uscita di .NET 5, della quale abbiamo parlato in questo articolo come ormai di consueto è stata rilasciata anche la nuova versione di C#, ormai giunta alla versione 9. Come per .NET, anche il linguaggio di riferimento dovrebbe arricchirsi di funzionalità ogni anno e per il momento questo appuntamento, con l'accoppiata .NET Core 3 e C# 8, e ora .NET 5 e C# 9, viene rispettato.

Come molto spesso accade, molte funzionalità sono solamente shortcut per rendere più produttivo la scrittura di codice e tutto è demandato al compilatore che dietro le quinte lavora per noi. Questo vuol dire che ciò che vedremo in questo articolo può potenzialmente essere usato anche con versioni di .NET precedenti, perfino con .NET Framework. In ogni caso è necessario che installiamo l'ultima versione di Visual Studio (attualmente 16.8) e .NET SDK 5.0 per poter compilare i nostri sorgenti. Per semplicità, è il TargetFramework indicato nei csproj a istruire il compilatore su quale versione usare, perciò il comportamento predefinito prevede che usando .NET 5.x possiamo usare C# 9, con .NET 3.x o .NET Standard 2.1 possiamo usare C# 8, fino ad arrivare a C# 7 per i progetti .NET Standard o .NET Framework. Nella realtà, possiamo intervenire su questo comportamento attraverso l'elemento LangVersion del csproj e forzare la versione desiderata.

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <LangVersion>9.0</LangVersion>
  </PropertyGroup>
</Project>

Possiamo quindi compilare e usare nuove caratteristiche, nel limite del possibile, limite rappresentato da alcune dipendenze che il linguaggio può avere, come, nel caso di C# 9, gli init only setters o i covariant return types. Insomma, la scelta più consigliata è sempre quella di aggiornare il runtime di riferimento a .NET 5 e di godere anche dei miglioramenti di prestazioni che questo introduce.

Fatta questa premessa vediamo quali sono le novità introdotte in questa nuova versione, come per esempio gli init only setter.

Init only setter

L'introduzione degli object initializer ha semplificato la verbosità del codice necessaria per poter istanziare un oggetto e valorizzarne delle proprietà, come mostrato nell'esempio seguente.

var p = new Person { FirstName = "Cristian", LastName = "Civera" }
p.LastName = "Pluto";

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }
}

Rispetto all'uso dei costruttori, questa sintassi ci permette in maniera più libera di impostare le proprietà che vogliamo e di leggere più facilmente il codice di inizializzazione. D'altra parte, però, siamo obbligati a fornire proprietà con l'accessorio set, consentendo di cambiare la proprietà anche in successivo momento.

Per ovviare a questo limite è stato introdotto l'accessorio init che va a sostituirsi al set, come mostrato nell'esempio.

public record Person
{
    public string FirstName { get; init; }

    public string LastName { get; init; }
}

In questo modo l'inizializzazione della proprietà è ancora possibile, ma non sono più possibili nuove assegnazioni come è stato fatto invece nell'esempio precedente assegnando a Pluto, fornendo un errore in compilazione. Da notare che comunque il costruttore viene invocato prima delle assegnazioni e nulla cambia dal punto di vista dei parametri nel costruttore.

5 pagine in totale: 1 2 3 4 5
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Top Ten Articoli

Articoli via e-mail

Iscriviti alla nostra newsletter nuoviarticoli per ricevere via e-mail le notifiche!

In primo piano

I più letti di oggi

In evidenza

Misc