C# 10 – The first 5 new features of the new version for Visual Studio 2022 (English version)

C# was officially released in January 2002, so in a few months’ time we will be able to celebrate the 20th birthday of this programming language. In the meantime, we already know that there will be a new version, namely the tenth. C# 10, together with Visual Studio 2022 and .NET 6, is expected around November 2021. From some official sources and the development team’s blog, it seems that there will be a lot of new features.

This can be a bit traumatising for all that you have to learn, but if you follow the news as it is published, you can find a lot of interesting news. In particular this is a selection of the 5 new features that will be in the new version of C#:

  1. Null Parameter Checking
  2. Required Properties
  3. Field Keyword
  4. Global Usings
  5. File Namespaces

1. Null Parameter Checking

The Null Reference Exception is one of the worst bugs you can have in your code. To protect against this kind of exception, you need a foolproof design of your application and a lot of checks on function parameters. This new feature should help us prevent this problem and make our code more readable and robust.

1.1 Current problem

At the moment, if you want to check that a certain parameter of your function is null, you should do something like this

public SomeFunction(int id, SomeClass newObject)
{
  if (newObject == null)
  {
    throw new ArgumentNullException("newObject");
  }
  ...
}

In this code we inject newObject of SomeClass into SomeFunction. If the object mentioned is null we should not proceed with the code. Many people will say that with proper application design this problem should not exist, but sometimes it is necessary to do so.

1.2 Characteristic of C# 10

The new version of C# aims to simplify this problem for us with: !!. All you have to do is add two exclamation marks (called “Bang bang”) after the parameter name:

public SomeFunction(int id, SomeClass newObject!!)
{
	...
}

In this example, the code will automatically check if newObject is null. The ArgumentNullException will automatically be thrown if the newObject value is null.

2. Required Properties

Weren’t constructors used more explicitly in the past? Today we don’t write heavy constructors, most of the time we use light constructors, i.e. we define property values directly.

2.1 Current problem

Since a couple of versions of C#, we can create objects using lightweight constructors like this:

var newArticle = new Article
{
	Title = "C# 10 - Top 5 new features",
	Category = ".NET",
	ReleaseDate = DateTime.Now()
}

The main problem with this approach is that sometimes we need to initialise some property and we don’t do it. For example, we could do something like this, although it doesn’t make sense to create an Article object without a title:

2.2 Characteristic of C# 10

C#10 introduces a new keyword for properties: required. This allows us to make a property mandatory when defining a class. If you try to create an object without the required property you will get an error at compile time.

public class Article
{
  public required string Title { get; init; }
  public string Category { get; init; }
  public DateTime ReleaseDate{ get; init; }
}

3. Field Keyword

Self-implemented properties are not a new feature; in fact, they first appeared in C# 3. This means that when code is compiled the compiler creates a private, anonymous field that can only be accessed through the get and set accessors of the property.

One of the interesting features that has come with the current version of C# is an init accessor. With this accessor, immutable objects are more flexible and allow the caller to mutate members during the act of construction.

3.1 Current problem

This is all well and good, but when this approach does not suit your problem you are forced to add a field and write the usual property methods. Something like this:

public class Article
{
  private string _title;
  public string Title
  {
    get
    {
      return _title;
    }
    set
    {
      if (value.Trim() == "")
        throw new ArgumentException("Title can't be empty");

      _title = value;
    }
  }
}

3.2 Characteristic of C# 10

The new version of the C# programming language introduces another new keyword: field. The above code can now be simplified:

public class Article
{
  public string Title
  {
    get;
    set
    {
      if (value.Trim() == "")
        throw new ArgumentException("Title can't be empty");
      field = value;
    }
  }
}

Basically, from C# 10 there will be no need to implement an additional field. This keyword can also be used in the init accessor:

public class Article
{
  public string Title
  {
    get;
    set
    {
      if (value.Trim() == "")
        throw new ArgumentException("Title can't be empty");
      field = value;
    }
  }

  public string Category { get; init; }
  public DateTime ReleaseDate{ get; init => field = value.Date(); }
}

4. Global Using

This is a new feature that will greatly simplify your code. As you know, every C# file starts with a list of “using” that are required for the implementation. However, sometimes this is redundant, especially if you are working with ASP.NET a lot of this code is repeated and in general is just “noise” for programmers.

4.1 Current problem

If we take an ASP.NET file as an example, the list of uses is enormous:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

4.2 Characteristic of C# 10

Another keyword that C# 10 introduces is global. By using global, you will be able to define global usings for the entire project. In general, it is recommended that you create a separate file that will contain these imports, something like usings.cs. This means that the other files in the project can be simplified as they no longer need to add all these using. C# designers refer to this as the elimination of “vertical (space) wastage”.

global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.HttpsPolicy;
global using Microsoft.AspNetCore.Identity;
global using Microsoft.AspNetCore.Identity.UI;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;

5. File Namespaces

By using the global keyword C# eliminates “vertical waste” and with file name spaces it eliminates “horizontal waste”. Basically, this feature aims to solve the indentation problem and is more than a cosmetic change: hopefully it will make the code cleaner.

5.1 Current problem

Nowadays, after the using list, the first thing you see in a C# file is the namespace definition. After that comes the definition of the class. The implementation of the class is already indented at this point. This is what we consider “horizontal waste”.

namespace Blog
{
  public class Article
  {
    ...
  }
}

5.2 Characteristic of C# 10

With this feature, you can define the file-level namespace like this:

namespace Blog;

public class Article
{
  ...
}

Conclusion

In this article, we have had the opportunity to familiarise ourselves with 5 new features that the new version of C# will bring. Some of them seem like a great improvement and it looks like they will affect the way we organise and write C# projects.

C# 10 – Le prime 5 nuove caratteristiche della nuova versione per Visual Studio 2022

C# è ufficialmente uscito nel gennaio 2002 e quindi tra qualche mese potremo festeggiare il 20° compleanno di questo linguaggio di programmazione. Nell’attesa, sappiamo già che ci sarà una nuova versione, precisamente la decima. C# 10, insieme a Visual Studio 2022 e a .NET 6, è atteso verso novembre 2021. A vedere alcune fonti ufficiali e il blog del team di sviluppo sembra che ci saranno parecchie novità.

Questo può essere un po’ traumatizzante per tutto quello che bisogna imparare, ma seguendo un po’ le notizie che via via vengono pubblicate si possono trovare parecchie notizie interessanti. In particolare questa è una selezione delle 5 nuove caratteristiche che ci saranno nella nuova versione di C#:

  1. Null Parameter Checking
  2. Required Properties
  3. Field Keyword
  4. Global Usings
  5. File Namespaces

1. Null Parameter Checking (Controllo dei parametri nulli)

La Null Reference Exception è uno dei peggiori bug che potete avere nel vostro codice. Per proteggersi da questo tipo di eccezioni, è necessaria una progettazione a prova di bomba dell’applicazione e un sacco di controlli sui parametri delle funzioni. Questa nuova caratteristica dovrebbe aiutarci a prevenire questo problema e rendere il nostro codice più leggibile e robusto.

1.1 Problema attuale

Al momento se volete controllare che un certo parametro della vostra funzione sia nullo, dovreste fare qualcosa del genere

public SomeFunction(int id, SomeClass newObject)
{
  if (newObject == null)
  {
    throw new ArgumentNullException("newObject");
  }
  ...
}

In questo codice iniettiamo newObject di SomeClass in SomeFunction. Se l’oggetto menzionato è nullo non dovremmo procedere con il codice. Molte persone diranno che con la corretta progettazione dell’applicazione questo problema non dovrebbe esistere, ma a volte è necessario farlo.

1.2 Caratteristica di C# 10

La nuova versione di C# mira a semplificarci questo problema con: !!. Tutto quello che dovete fare è aggiungere due punti esclamativi (che vengono chiamati “Bang bang“) dopo il nome del parametro:

public SomeFunction(int id, SomeClass newObject!!)
{
	...
}

In questo esempio, il codice controllerà automaticamente se newObject è nullo. La ArgumentNullException sarà automaticamente lanciata se il valore newObject è nullo.

2. Required Properties (Proprietà richieste)

I costruttori non erano usati più esplicitamente in passato? Oggi non scriviamo costruttori pesanti, il più delle volte usiamo costruttori leggeri, cioè definiamo direttamente i valori delle proprietà.

2.1 Problema attuale

Da un paio di versioni di C#, possiamo creare oggetti usando costruttori leggeri come questo:

var newArticle = new Article
{
	Title = "C# 10 - Top 5 new features",
	Category = ".NET",
	ReleaseDate = DateTime.Now()
}

Il problema principale con questo approccio è che a volte abbiamo bisogno di inizializzare qualche proprietà e non lo facciamo. Per esempio, potremmo fare qualcosa del genere, anche se non ha senso creare un oggetto Article senza un titolo:

2.2 Caratteristica di C# 10

C#10 introduce una nuova parola chiave per le proprietà: required. In questo modo, quando si definisce una classe, possiamo rendere una proprietà obbligatoria. Se provi a creare un oggetto senza la proprietà required otterrai un errore in fase di compilazione.

public class Article
{
  public required string Title { get; init; }
  public string Category { get; init; }
  public DateTime ReleaseDate{ get; init; }
}


3. Field Keyword (Parola chiave di campo)

Le proprietà autoimplementate non sono una nuova caratteristica, infatti, sono apparse per la prima volta in C# 3. Questo significa che quando il codice viene compilato il compilatore crea un campo privato, anonimo, che può essere accessibile solo attraverso gli accessor get e set della proprietà.

Una delle caratteristiche interessanti che è arrivata con l’attuale versione di C# è un accessor init. Con questo accessor, gli oggetti immutabili sono più flessibili e permettono al chiamante di mutare i membri durante l’atto della costruzione.

3.1 Problema attuale

Tutto questo è ottimo, ma quando questo approccio non si adatta al vostro problema siete costretti ad aggiungere un campo e a scrivere i soliti metodi di proprietà. Qualcosa del genere:

public class Article
{
  private string _title;
  public string Title
  {
    get
    {
      return _title;
    }
    set
    {
      if (value.Trim() == "")
        throw new ArgumentException("Title can't be empty");

      _title = value;
    }
  }
}


3.2 Caratteristica di C# 10

La nuova versione del linguaggio di programmazione C# introduce un’altra nuova parola chiave: field. Il codice di cui sopra può ora essere semplificato:

public class Article
{
  public string Title
  {
    get;
    set
    {
      if (value.Trim() == "")
        throw new ArgumentException("Title can't be empty");
      field = value;
    }
  }
}

In sostanza, da C# 10 non ci sarà bisogno di implementare un campo aggiuntivo. Questa parola chiave può anche essere usata nell’accessor init:

public class Article
{
  public string Title
  {
    get;
    set
    {
      if (value.Trim() == "")
        throw new ArgumentException("Title can't be empty");
      field = value;
    }
  }

  public string Category { get; init; }
  public DateTime ReleaseDate{ get; init => field = value.Date(); }
}


4. Global Using (Using globali)

Questa è una nuova caratteristica che semplificherà molto il codice. Come sapete, ogni file C# inizia con una lista di “using” che sono necessari per l’implementazione. Tuttavia, a volte questo è ridondante, specialmente se state lavorando con ASP.NET molto di questo codice è ripetuto e in generale è solo “rumore” per i programmatori.

4.1 Problema attuale

Se prendiamo per esempio un file ASP.NET, l’elenco degli usi è enorme:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;


4.2 Caratteristica di C# 10

Un’altra parola chiave che C# 10 introduce è global. Usando global, sarete in grado di definire using globali per l’intero progetto. In generale, si raccomanda di creare un file separato che conterrà queste importazioni, qualcosa come usings.cs. Questo significa che gli altri file del progetto possono essere semplificati poiché non hanno più bisogno di aggiungere tutti questi using. I progettisti C# si riferiscono a questo come all’eliminazione degli “sprechi (di spazio) verticali”.

global using Microsoft.AspNetCore.Builder;
global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.HttpsPolicy;
global using Microsoft.AspNetCore.Identity;
global using Microsoft.AspNetCore.Identity.UI;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.Extensions.Configuration;
global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Hosting;
global using System;
global using System.Collections.Generic;
global using System.Linq;
global using System.Threading.Tasks;

5. File Namespaces (Spazi dei nomi dei file)

Usando la parola chiave global C# elimina lo “spreco verticale” e con gli spazi dei nomi dei file elimina lo “spreco orizzontale”. Fondamentalmente, questa caratteristica mira a risolvere il problema dell’indentazione ed è più di un cambiamento cosmetico: si spera che questo possa rendere il codice più pulito.

5.1 Problema attuale

Al giorno d’oggi, dopo la lista degli using, la prima cosa che si vede in un file C# è la definizione del namespace. Dopo di che viene la definizione della classe. L’implementazione della classe è già indentata a questo punto. Questo è ciò che consideriamo uno “spreco orizzontale”.

namespace Blog
{
  public class Article
  {
    ...
  }
}


5.2 Caratteristica C# 10

Con questa caratteristica potete definire il namespace a livello di file in questo modo:

namespace Blog;

public class Article
{
  ...
}

Conclusione

In questo articolo, abbiamo avuto la possibilità di familiarizzare con 5 nuove caratteristiche che la nuova versione di C# porterà. Alcune di esse sembrano un grande miglioramento e sembra che influenzeranno il modo in cui organizziamo e scriviamo i progetti C#.

Books and articles in English

For at least 15 years now, I have published at least 50 articles and 16 books on technical subjects: programming, databases, electronics (with Arduino), Office and so on.
So far, I have only published in Italian, but I feel the need to expand my horizons, so I am going to do an experiment: I will try to translate some of my articles from Italian into English. I will also try to translate my next posts in this blog.
I would appreciate it if you could point out any grammatical errors (or nonsense sentences) so that I can improve my translations.
Thank you!


TRADUZIONE | Trad&Co | Elisabetta Minetto

Si riparte dopo la pausa!

Le mie brevi ferie al mare (una settimana) stanno per volgere al termine e domani tornerò nella fresca Belluno per una lenta ripresa della vita normale.

È stata una settimana di relax ma anche di riflessioni su cosa veramente voglio portare avanti tra tutte le idee e gli esperimenti che ho avviato, tra video, libri, articoli, podcast e così via.

Penso che nei prossimi mesi mi concentrerò soprattutto su due filoni: libri e video.

Per quanto riguarda i libri, considerato che di materiale c’è n’è tanto, sto pensando di scrivere e pubblicare una trilogia su C#: un libro base su C#, uno su argomenti avanzati e uno su “dati e algoritmi”.

L’altro filone sui video viene fuori dalla sperimentazione del mio canale YouTube. Visite ne ho parecchie, ma YouTube non monetizza nulla se non si raggiungono volumi esagerati di visualizzazioni. Però è una ottima prova per passare al livello successivo. Faccio spesso questi esperimenti, provo una cosa nuova, la alimento, la faccio maturare e crescere e vedo come va. Se va bene, bisogna strutturarla. Ecco perché i video diventeranno veri corsi su Udemy. Ovviamente dovrò rifarli con maggiore criterio per renderli fruibili nel modo adeguato: tempi giusti senza sprechi, testi precisi, esempi calzanti. Forse farò anche degli esperimenti in inglese, chissà… Ma è meglio non mettere troppa carne al fuoco: poche cose ma fatte bene.

Buone vacanze a chi non è ancora andato (molti in Italia scelgono agosto) e buona ripresa a chi è già tornato.

Sempre avanti, chi si ferma è perduto! 🤣

Punto della situazione pre-ferie

Era parecchio tempo che non mi dedicavo a scrivere libri e articoli, a sperimentare, a scrivere codice, a fare progetti sul futuro. Poi non so cosa sia successo, ma nell’ultima parte del 2020 (sarà stata la depressione da Covid?), mi sono lanciato in una continua corsa che sta continuando fino ad oggi. Tra qualche giorno andrò in ferie e quindi vorrei fare un po’ il punto della situazione delle cose fatte fino a qui e di quelle che continuerò dopo le ferie.
Innanzi tutto i libri… da dicembre a oggi ne ho pubblicati tre, tutti rigorosamente in “self publishing” e pubblicati sia sulla piattaforma Youcanprint.it (che mi consente di averli su tutti gli store online e nelle librerie fisiche) sia su Gumroad.com in formato PDF (
https://gumroad.com/mdeghetto):

– “Corso di Basi di Dati I”
– “Visual Basic 2019 – Guida alla programmazione”
– “Word 2019 – Guida per iniziare”

Su Gumroad.com ho pubblicato anche 4 miei articoli:

– 001 Creare controlli utente con Visual Basic 2019
– 002 Programmazione concorrente in F#
– 003 Programmiamo Arduino con Visual Studio
– 004 Arduino musicale con Visual Studio

Sono tutte iniziative a pagamento, anche se a costi accessibili, perché sto cercando di trovare un “piano B” alla mia vita lavorativa che attualmente non mi sta dando assolutamente alcuna soddisfazione dal punto di vista economico (come a molte altre persone senza dubbio, ma non credo che il desiderio di migliorare sia deprecabile).
Ho poi un altro progetto che mi frulla in mente da un po’ e sto ponendo la “prima pietra angolare” di questa costruzione: una libreria di classi per .NET Standard e .NET Core, con funzioni di vario genere. Nella mia idea sarà una libreria distribuita gratuitamente via NuGet, ma il manuale di istruzioni sarà un libro a pagamento (sempre su Gumroad.com). Questa scelta è per facilitarmi la gestione fiscale, dato che nella mia attuale situazione è più semplice dichiarare i diritti d’autore piuttosto che avviare una vera e propria vendita di prodotto (che richiederebbe una partita IVA e molto altro). Un po’ come alcune applicazioni gestionali/contabili che vengono distribuite gratuitamente e/o in open source, ma che richiedono una consulenza a pagamento (non è il mio caso, ma è una similitudine).
Altri progetti? Certo che sì:

– i video del mio canale YouTube (https://www.youtube.com/c/MarioDeGhetto)
– i podcast del mio canale (
https://www.spreaker.com/user/mdeghetto)
– i blog post di questo blog e del mio personale (
https://deghetto.wordpress.com)
– continuare lo studio e applicare le conoscenze a progetti di elettronica con Arduino e Raspberry Pi
– scrivere altri libri su C#, Visual Studio 2022, F#, Algoritmi e chi più ne ha più ne metta
– stessa cosa per gli articoli…

Insomma un apoteosi di materiale per il quale mi servirebbero 72 ore al giorno!
Per il momento mi accontento e mi accingo ad andare a fare le meritate ferie, poi si vedrà.
Un saluto a tutti e buone ferie a chi deve ancora andarci.

Nuovo progetto: libreria di classi. NET

Mi lancio in un nuovo progetto: una libreria di classi per applicazioni .NET Standard e .NET Core.

La distribuzione sarà basata su una .DLL compilata.

La distribuirò gratuitamente, man mano che andrò avanti con lo sviluppo, ma il manuale d’uso sarà a pagamento sulla piattaforma gumroad.com. Dato che il prezzo del manuale crescerà con la crescita della libreria, chi acquista il manuale avrà anche un anno di aggiornamenti del manuale senza ulteriori addebiti e con notifica nella casella mail utilizzata in fase di acquisto.

Aggiornamenti su questo progetto molto presto… say tuned!

😊