NET5: Record Type

NET5: Record Type

Tra le novità introdotte in net5 possiamo trovare i Record Type e personalmente li ho trovati molto interessanti.

In cosa consiste?

Dichiarare un Record Type non risulta molto diverso dal dichiarare una class (prendete con le pinze la frase) nella quale vi sono presenti solamente delle proprietà. Sappiate che queste proprietà non saranno modificabili una volta istanziato il nuovo oggetto di tipo record.

Dichiarazione

Come primo passaggio per utilizzare un Record Type dobbiamo procedere alla sua definizione

1
2
3
4
5
6
7
8
9
public record Pizza
{
    public string Name { get; }
    public string Ingredients { get; }
    public decimal Price { get; }

    public Pizza(string name, string ingredients, decimal price)
        => (Name, Ingredients, Price) = (name, ingredients, price);
}

Sappiate che amo la pizza e trovo illegale/immorale essere perennemente in zona rossa con le pizzerie chiuse. L’esempio non è stato casuale, ve lo posso garantire.

Ora non ci resta che istanziare per la prima volta un oggetto di tipo record

1
2
3
4
5
6
Pizza pizza = new Pizza
    (
        "Pizza Bla Bla Bla",
        "Fantasia del Pizzaiolo",
        10.5
    );

Se vi siete accorti di avere definito male una proprietà di “pizza” sappiate che non potete cambiare il suo valore al volo. Dovrete procedere con una nuova new. Infatti scrivendo la seguende istruzione

1
pizza.Name = "Pizza Bla Bla";
CodeDescription
CS0200roperty or indexer ‘Pizza.Name’ cannot be assigned to – it is read only

Equals

La parte veramente bella (che tanto mi piace) nell’utilizzare i Record Type riguarda il concetto di ugualianza. In che senso?

Supponiamo di volere ordinare una seconda pizza (non stupitevi, per me è la normalità quando esco in pizzeria post allenamento)

1
2
3
4
5
6
Pizza pizzaBis = new Pizza
    (
        "Pizza Bla Bla Bla",
        "Fantasia del Pizzaiolo",
        10.5
    );

Ora proviamo a porci la domanda: Ho ordinato la stessa pizza?

1
bool samePizza = (pizza == pizzaBis);

Secondo voi quale valore avrà la variabile samePizza in questo caso?

Sappiate che true è la risposta corretta! Si, avete letto bene.

Abituati a lavorare con le classi forse vi sareste aspettati un false come ritorno, ma in questo caso grazie ai Record Type l’ugualianza sarà basata sui valori contenuti nelle proprietà definite in fase di creazione.

Vi ricordate che “menata” scrivere ogni volta un metodo “Equals(obj1, obj2)” ed al suo interno mettere una quintalata di if e return false?

Ecco, sappiate che se ripenso ad un progetto sul quale ho lavorato per anni ho ancora gli incubi notturni per questo motivo (e non solo per questo….)