operador new: el operador new crea una nueva instancia de un tipo

El operador new crea una nueva instancia de un tipo. También puede usar la palabra clave new como un modificador de declaración de miembro o una restricción de tipo genérico.

Invocación del constructor

Para crear una nueva instancia de un tipo, normalmente se invoca uno de los constructores de ese tipo mediante el operador 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

Puede usar un inicializador de colección u objeto con el operadornew para crear una instancia e inicializar un objeto en una sola instrucción, como se muestra en el ejemplo siguiente:

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

Con tipo de destino new

Las expresiones de invocación del constructor están tipadas en el destino. Es decir, si se conoce el tipo de destino de una expresión, puede omitir un nombre de tipo, como se muestra en el ejemplo siguiente:

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

Como se muestra en el ejemplo anterior, siempre se usan paréntesis en una expresión new con tipo de destino.

Si se desconoce el tipo de destino de una expresión new (por ejemplo, cuando se usa la palabra clave var), se debe especificar un nombre de tipo.

creación de matriz

También se usa el operador new para crear una instancia de matriz, como se muestra en el ejemplo siguiente:

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

Utilice la sintaxis de inicialización de matriz para crear una instancia de matriz y rellenarla con los elementos en una sola instrucción. En el ejemplo siguiente se muestran varias maneras de hacerlo:

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

Para obtener más información sobre las matrices, consulte Matrices.

Creación de instancias de tipos anónimos

Para crear una instancia de un tipo anónimo, utilice el operador new y la sintaxis de inicializador de objeto:

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

Destrucción de instancias de tipo

No tiene que destruir instancias de tipo creadas anteriormente. Las instancias de tipos de valor y referencia se destruyen automáticamente. Las instancias de tipos de valor se destruyen en cuanto se destruye el contexto que los contiene. Las instancias de tipos de referencia los destruye el recolector de elementos no utilizados en un momento no especificado después de eliminarse la última referencia a ellos.

Para los tipos de instancia que contienen recursos no administrados, como un identificador de archivo, se recomienda realizar una limpieza determinista para asegurarse de que los recursos que contienen se liberan tan pronto como sea posible. Para más información, vea la referencia de la API System.IDisposable y el artículo sobre la instrucción using.

Posibilidad de sobrecarga del operador

Un tipo definido por el usuario no puede sobrecargar el operador new.

Especificación del lenguaje C#

Para más información, vea la sección El operador new de la Especificación del lenguaje C#.

Para más información sobre la expresión new con tipo de destino, consulte la nota de propuesta de características.

Consulte también