ny operator – Operatorn new skapar en ny instans av en typ

Operatorn new skapar en ny instans av en typ. Du kan också använda nyckelordet new som en medlemsdeklarationsmodifierare eller en allmän typbegränsning.

Konstruktoranrop

Om du vill skapa en ny instans av en typ anropar du vanligtvis en av konstruktorerna av den typen med operatornnew:

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

Du kan använda ett objekt eller en insamlingsinitiator med operatorn new för att instansiera och initiera ett objekt i en -instruktion, som följande exempel visar:

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

Måltyp new

Konstruktoranropsuttryck är måltypade. Det vill säga om en måltyp för ett uttryck är känd kan du utelämna ett typnamn, vilket visas i följande exempel:

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

Som föregående exempel visar använder du alltid parenteser i ett måltypat new uttryck.

Om en måltyp för ett new uttryck är okänd (till exempel när du använder nyckelordet var ) måste du ange ett typnamn.

Skapande av matris

Du kan också använda operatorn new för att skapa en matrisinstans, vilket visas i följande exempel:

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

Använd syntaxen för matrisinitiering för att skapa en matrisinstans och fylla den med element i en instruktion. I följande exempel visas olika sätt att göra det på:

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

Mer information om matriser finns i Matriser.

Instansiering av anonyma typer

Om du vill skapa en instans av en anonym typ använder du syntaxen för operatorn new och objektinitieraren:

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

Förstörelse av typinstanser

Du behöver inte förstöra tidigare skapade typinstanser. Instanser av både referens- och värdetyper förstörs automatiskt. Instanser av värdetyper förstörs så snart kontexten som innehåller dem förstörs. Instanser av referenstyper förstörs av skräpinsamlaren vid en ospecificerad tidpunkt efter att den senaste referensen till dem har tagits bort.

För typinstanser som innehåller ohanterade resurser, till exempel ett filhandtag, rekommenderar vi att du använder deterministisk rensning för att säkerställa att resurserna de innehåller släpps så snart som möjligt. Mer information finns i api-referensen System.IDisposable och instruktionsartikeln using .

Överlagring av operator

En användardefinierad typ kan inte överbelasta operatorn new .

Språkspecifikation för C#

Mer information finns i Avsnittet om den nya operatorn i C#-språkspecifikationen.

Mer information om ett måltypat new uttryck finns i kommentaren om funktionsförslag.

Se även