Delen via


nieuwe operator: de new operator maakt een nieuw exemplaar van een type

De new operator maakt een nieuw exemplaar van een type. U kunt het new trefwoord ook gebruiken als wijzigingsfunctievoor liddeclaraties of een algemene typebeperking.

Aanroep van constructor

Als u een nieuw exemplaar van een type wilt maken, roept u doorgaans een van de constructors van dat type aan met behulp van de new operator:

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

U kunt een object- of verzamelingsinitialiseerde functie met de new operator gebruiken om een object in één instructie te instantiëren en initialiseren, zoals in het volgende voorbeeld wordt weergegeven:

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

Doel getypt new

Expressies voor aanroep van constructor zijn doelgetypeerd. Als een doeltype van een expressie bekend is, kunt u een typenaam weglaten, zoals in het volgende voorbeeld wordt weergegeven:

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

Zoals in het voorgaande voorbeeld wordt weergegeven, gebruikt u altijd haakjes in een doelexpressie die is getypt new .

Als een doeltype van een new expressie onbekend is (bijvoorbeeld wanneer u het var trefwoord gebruikt), moet u een typenaam opgeven.

Matrix maken

U gebruikt ook de new operator om een matrixexemplaren te maken, zoals in het volgende voorbeeld wordt weergegeven:

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

Gebruik de syntaxis van de matrixinitialisatie om een matrixexemplaren te maken en deze te vullen met elementen in één instructie. In het volgende voorbeeld ziet u verschillende manieren waarop u dit kunt doen:

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

Zie Matrices voor meer informatie over matrices.

Instantiëring van anonieme typen

Als u een exemplaar van een anoniem type wilt maken, gebruikt u de syntaxis van de new operator en de object-initialisatiefunctie:

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

Vernietiging van type exemplaren

U hoeft eerder gemaakte typeexemplaren niet te vernietigen. Exemplaren van zowel referentie- als waardetypen worden automatisch vernietigd. Exemplaren van waardetypen worden vernietigd zodra de context die deze bevat, wordt vernietigd. Exemplaren van referentietypen worden vernietigd door de garbagecollector op een niet-opgegeven tijdstip nadat de laatste verwijzing ernaar is verwijderd.

Voor typeexemplaren die niet-beheerde resources bevatten, bijvoorbeeld een bestandsingang, is het raadzaam om deterministische opschoning te gebruiken om ervoor te zorgen dat de resources die ze bevatten zo snel mogelijk worden vrijgegeven. Zie de System.IDisposable API-verwijzing en het using instructieartikel voor meer informatie.

Overbelasting van operatoren

Een door de gebruiker gedefinieerd type kan de new operator niet overbelasten.

C#-taalspecificatie

Zie de nieuwe operatorsectie van de C#-taalspecificatie voor meer informatie.

Zie de notitie van het functievoorstel voor meer informatie over een doelexpressienew.

Zie ook