Nelle versioni precedenti di C# la definizione di un nuovo avveniva utilizzando la seguente sintassi:
public class Person
{
public Person() { }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
}Nel codice precedente è stato creato il costruttore di default, un costruttore con parametri e due proprietà pubbliche. Ovviamente per la creazione di un nuovo oggetto possiamo usare :
var person = new Person();
oppure nella passando i parametri al costruttore:
var person = new Person("Andrea", "Merlin");In entrambi i casi subito dopo il new, dobbiamo indicare il nome della classe che dovrà essere utilizzata (e quindi verrà richiamato il relativo costruttore). In C# 9.0 possiamo evitare di indicare il nome della classe da utilizzare. Vediamo come.
Scrivere codice in questo modo è perferttamente lecito:
Person person = new();
in pratica viene richiamato il costrutto senza parametri della classe Person. Analogamente possiamo scrivere:
Person person = new("Andrea", "Merlin");Quello che avviene dietro alle quinte è che C# 9.0 “capisce” il tipo che dovrà essere utilizzato prendendolo dalla parte destra del codice (Person). Non è possibile usare Target-Typed dichiando la variabile con var:
var person = new("Andrea", "Merlin"); perchè in questo caso non è in grado di capire che tipo dovrà essere la variabile person.
Ovviamente questo meccanismo funziona anche nel caso in cui i parametri dei costruttori siano opzionali.
A questo punto ci si potrebbe chiedere qual’è la differenza nell’utilizzare queste due sintassi?
Person friend = new("Andrea", "Merlin");var person = new Person("Andrea", "Merlin");Per entrambe le istruzioni precedenti, il compilatore C# produce esattamente lo stesso codice del linguaggio, quindi abbiamo la libertà di scegliere la sintassi che vogliamo. Almeno per quanto riguarda le variabili locali .