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 instruktionsartikelnusing
.
Ö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.