NET5: Init Only per le proprietà

NET5: Init Only per le proprietà

Una delle novità di NET5 che ho sperimentato subito e’ stato il potere utilizzare Init Only Setters nella definizione delle property del nostro codice.

In cosa consiste?

Tramite Init Only Setters sarà possibile assegnare il valore alla nostra property tramite il costruttore della classe e non direttamente. State per caso pensando frasi come:

Andrea, guarda che potevamo farlo benissimo anche prima di NET5 e di C# 9. Lo sai vero?

Certamente! Ma tramite l’utilizzo di Init Only Setters sarà tutto molto più semplice

Init & property

Per spiegarvi al meglio il tutto ho definito una classe People con al suo interno due proprietà entrambe con la parola chiave init invece di set

1
2
3
4
5
public class People
{
    public string FirstName { get; init; }
    public string LastName { get; init; }
}

Ora bisogna solamente capire come assegnare dall’esterno il valore desiderato. Se per sbagli vi dovesse venire la voglia e l’istinto di provare a scrivere

1
2
People p = new People();
p.FirstName = "Andrea";

Sappiate che il risultato ottenuto sarà il seguente errore di compilazione

CodeDescription
CS8852Init-only property or indexer ‘People.FirstName’ can only be assigned in an object initializer, or on ‘this’ or ‘base’ in an instance constructor or an ‘init’ accessor.

A questo punto non ci resta che adeguare il codice all’utilizzo di init nel seguente modo:

1
2
3
4
5
People p = new People()
{
    FirstName = "Andrea",
    LastName = "Carratta"
};

In questo modo l’errore Init-only property […] can only be assigned in an object initializer di prima non sarà più tra i vostri errori di compilazione!

Note init

Personalmente trovo l’utilizzo di init fantastico soprattutto per evitare i giochetti che si facevano in precedenza per ottenere lo stesso risultato. L’unico consiglio che mi sento di darvi in questo momento riguarda il non abusarne presi dall’entusiasmo. Mi spiego meglio o almeno ci provo.

Init Only Setters bisogno utilizzarlo su dati che non cambieranno MAI durante l’esecuzione del metodo. Il cambio di una property definita con init di costringe a creare una nuova istanza della classe e travasare i vecchi valori per modificarne uno (o almeno uno).