Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Operatore new: l'operatore
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.
Il riferimento al linguaggio C# documenta la versione rilasciata più di recente del linguaggio C#. Contiene anche la documentazione iniziale per le funzionalità nelle versioni di anteprima pubblica per la prossima versione del linguaggio di programmazione.
La documentazione identifica tutte le funzionalità introdotte nelle ultime tre versioni della lingua o nelle anteprime pubbliche correnti.
Suggerimento
Per trovare quando una funzionalità è stata introdotta per la prima volta in C#, vedere l'articolo sulla cronologia delle versioni del linguaggio C#.
Chiamata di un costruttore
Per creare una nuova istanza di un tipo, richiamare uno dei costruttori di tale tipo usando 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 illustrato nell'esempio precedente, usare sempre le parentesi in un'espressione tipizzata di new destinazione.
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 le istanze del tipo create in precedenza. Il sistema elimina automaticamente le istanze di tipi riferimento e valore. Il sistema elimina definitivamente le istanze dei tipi valore non appena il contesto che li contiene viene eliminato definitivamente. Il Garbage Collector elimina definitivamente le istanze dei tipi di riferimento in un determinato momento non specificato dopo la rimozione dell'ultimo riferimento.
Per le istanze di tipo che contengono risorse non gestite, ad esempio un handle di file, usare la pulizia deterministica per assicurarsi che le risorse vengano rilasciate il prima possibile. Per altre informazioni, vedere le System.IDisposable informazioni di riferimento sulle API e l'articolo sull'istruzioneusing .
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à.