Partager via


Nouvel opérateur : l’opérateur new crée une nouvelle instance d’un type

L’opérateur new crée une nouvelle instance d’un type. Vous pouvez également utiliser le mot clé new comme modificateur de déclaration de membre ou contrainte de type générique.

La documentation de référence du langage C# décrit la version la plus récente du langage C#. Il contient également la documentation initiale des fonctionnalités dans les préversions publiques pour la prochaine version du langage.

La documentation identifie toute fonctionnalité introduite en premier dans les trois dernières versions de la langue ou dans les préversions publiques actuelles.

Conseil / Astuce

Pour savoir quand une fonctionnalité a été introduite en C#, consultez l’article sur l’historique des versions du langage C#.

Appel du constructeur

Pour créer une instance d’un type, appelez l’un des constructeurs de ce type à l’aide de l’opérateur 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

Vous pouvez utiliser un initialiseur d’objet ou de collection avec l’opérateur new pour instancier et initialiser un objet dans une instruction, comme dans l’exemple suivant :

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

Type cible new

Les expressions d’appel de constructeur sont typées par cible. Autrement dit, si un type cible d’une expression est connu, vous pouvez omettre un nom de type, comme l’illustre l’exemple suivant :

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 }
};

Comme l’illustre l’exemple précédent, utilisez toujours des parenthèses dans une expression typée new cible.

Si le type cible d’une expression new est inconnu (par exemple, lorsque vous utilisez le mot clé var), vous devez spécifier un nom de type.

Création de tableau

Vous utilisez également l’opérateur new pour créer une instance de tableau, comme dans l’exemple suivant :

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

Utilisez la syntaxe d’initialisation de tableau pour créer une instance de tableau et la remplir avec des éléments dans une instruction. L’exemple suivant montre différentes façons de procéder :

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[]

Pour plus d’informations sur les tableaux, consultez Tableaux.

Instanciation des types anonymes

Pour créer une instance d’un type anonyme, utilisez l’opérateur new et la syntaxe d’initialiseur d’objet :

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

Destruction des instances de type

Vous n’avez pas besoin de détruire les instances de type créées précédemment. Le système détruit automatiquement les instances des types référence et valeur. Le système détruit les instances de types valeur dès que le contexte qui les contient est détruit. Le garbage collector détruit les instances de types de référence à une heure non spécifiée après la dernière référence à celles-ci.

Pour les instances de type qui contiennent des ressources non managées, telles qu’un handle de fichier, utilisent un nettoyage déterministe pour vous assurer que les ressources sont publiées dès que possible. Pour plus d’informations, consultez la référence API System.IDisposable et l’article Instruction using.

Capacité de surcharge de l’opérateur

Un type défini par l’utilisateur peut surcharger l’opérateur new.

spécification du langage C#

Pour plus d’informations, consultez la section Opérateur new de la spécification du langage C#.

Pour plus d’informations sur une expression new typée par cible, consultez la note de proposition de fonctionnalité.

Voir aussi