Operatore new: l'operatore new consente di creare una nuova istanza di un tipo

L'operatore new consente di creare una nuova istanza di un tipo. È anche possibile usare la parola chiave new come modificatore di dichiarazione di membro o come vincolo di tipo generico.

Chiamata di un costruttore

Per creare una nuova istanza di un tipo, in genere si chiama uno dei costruttori del tipo in questione tramite l'operatore new:

var dict = new Dictionary<string, int>();
dict["first"] = 10;
dict["second"] = 20;
dict["third"] = 30;

Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30

È possibile usare un inizializzatore di oggetto o insieme con l'operatore new per creare un'istanza di un oggetto e inizializzare l'oggetto in un'unica istruzione, come illustrato nell'esempio seguente:

var dict = new Dictionary<string, int>
{
    ["first"] = 10,
    ["second"] = 20,
    ["third"] = 30
};

Console.WriteLine(string.Join("; ", dict.Select(entry => $"{entry.Key}: {entry.Value}")));
// Output:
// first: 10; second: 20; third: 30

new con tipo di destinazione

Le espressioni di chiamata del costruttore sono espressioni con tipo di destinazione. Ciò significa che se il tipo di destinazione di un'espressione è noto, è possibile omettere il nome del tipo, come illustrato nell'esempio seguente:

List<int> xs = new();
List<int> ys = new(capacity: 10_000);
List<int> zs = new() { Capacity = 20_000 };

Dictionary<int, List<int>> lookup = new()
{
    [1] = new() { 1, 2, 3 },
    [2] = new() { 5, 8, 3 },
    [5] = new() { 1, 0, 4 }
};

Come mostrato nell'esempio precedente, in un'espressione new con tipo di destinazione si usano sempre le parentesi.

Se un tipo di destinazione di un'espressione new è sconosciuto, ad esempio quando si usa la parola chiave var, è necessario specificare il nome del tipo.

creazione di matrici

È possibile usare l'operatore new per creare un'istanza di matrice, come illustrato nell'esempio seguente:

var numbers = new int[3];
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
Console.WriteLine(string.Join(", ", numbers));
// Output:
// 10, 20, 30

Usare la sintassi di inizializzazione di una matrice per creare un'istanza di una matrice e popolarla con elementi in un'unica istruzione. L'esempio seguente illustra diversi modi per eseguire questa operazione:

var a = new int[3] { 10, 20, 30 };
var b = new int[] { 10, 20, 30 };
var c = new[] { 10, 20, 30 };
Console.WriteLine(c.GetType());  // output: System.Int32[]

Per altre informazioni sulle matrici, vedere Matrici.

Creazione di istanze di tipi anonimi

Per creare un'istanza di un tipo anonimo, usare l'operatore new e la sintassi dell'inizializzatore di oggetto:

var example = new { Greeting = "Hello", Name = "World" };
Console.WriteLine($"{example.Greeting}, {example.Name}!");
// Output:
// Hello, World!

Eliminazione di istanze di tipi

Non è necessario eliminare definitivamente istanze di tipi create in precedenza. Le istanze dei tipi riferimento e valore vengono eliminate definitivamente in modo automatico. Le istanze dei tipi valore vengono eliminate definitivamente non appena viene eliminato definitivamente il contesto che le contiene. Le istanze dei tipi riferimento vengono eliminate definitivamente da Garbage Collector in un momento non specificato dopo che è stato rimosso l'ultimo riferimento ad esse.

Per le istanze dei tipi che contengono risorse non gestite, ad esempio un handle di file, è consigliabile adottare la pulizia deterministica per garantire che le risorse contenute al loro interno vengano rilasciate nel più breve tempo possibile. Per altre informazioni, vedere le informazioni di riferimento dell'API System.IDisposable e l'articolo sull' istruzione using .

Overload degli operatori

Un tipo definito dall'utente può eseguire l'overload dell'operatore new.

Specifiche del linguaggio C#

Per altre informazioni, vedere la sezione Operatore new della specifica del linguaggio C#.

Per altre informazioni su un'espressione new con tipo di destinazione, vedere la nota sulla proposta di funzionalità.

Vedi anche