multiple - generic type c#
Inicializando una Generic.List en C# (7)
En C #, puedo inicializar una lista usando la siguiente sintaxis.
List<int> intList= new List<int>() { 1, 2, 3 };
Me gustaría saber cómo funciona la sintaxis {}
y si tiene un nombre. Hay un constructor que toma un IEnumerable
, podrías llamar eso.
List<int> intList= new List<int>(new int[]{ 1, 2, 3 });
Eso parece más "estándar". Cuando deconstruyo el constructor predeterminado para la Lista, solo veo
this._items = Array.Empty;
Me gustaría poder hacer esto.
CustomClass abc = new CustomClass() {1, 2, 3};
Y poder usar la lista 1, 2, 3
. ¿Como funciona esto?
Actualizar
Jon Skeet respondió
Está llamando al constructor sin parámetros, y luego llamando a Agregar:
> List<int> tmp = new List<int>();
> tmp.Add(1); tmp.Add(2); tmp.Add(3);
> List<int> intList = tmp;
Entiendo lo que es. Quiero saber cómo. ¿Cómo sabe esa sintaxis para llamar al método Agregar?
Actualizar
Lo sé, qué cliché aceptar una respuesta de Jon Skeet. Pero, el ejemplo con las cuerdas y los puntos es increíble. También una página de MSDN muy útil es:
Creo que es un atajo al método .Add. Sin embargo, nunca intenté anularlo, así que no sé si es posible.
El nombre que está buscando es "Inicializador de colecciones". Funciona bajo el capó buscando un método llamado Agregar en el tipo de colección y llamándolo para cada valor que especifique.
Más detalles: Inicializadores de objeto e colección (Guía de programación C #)
En lo que a mí respecta, la adición de elementos a través de la inicialización de objetos busca un método Agregar. Entonces, como List <int> tendrá void Add (int), funcionará.
Para usarlo en tu clase, simplemente agrega
class CustomClass {
public void Add(int num) {
// Your code here
}
}
Tu clase debería implementar IEnumerable, como señaló Hallgrim.
En realidad está usando el método .Add
. Lo que significa que está llamando .Add
para cada elemento en los corchetes dentro del constructor.
Esto se llama inicializador de colección . Está llamando al constructor sin parámetros, y luego llamando a Agregar:
List<int> tmp = new List<int>();
tmp.Add(1);
tmp.Add(2);
tmp.Add(3);
List<int> intList = tmp;
Los requisitos para el tipo son:
- Implementa
IEnumerable
- Tiene sobrecargas de
Add
que son apropiadas para los tipos de argumentos que proporciona. Puede proporcionar argumentos múltiples entre llaves, en cuyo caso el compilador busca un métodoAdd
con múltiples parámetros.
Por ejemplo:
public class DummyCollection : IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
throw new InvalidOperationException("Not a real collection!");
}
public void Add(string x)
{
Console.WriteLine("Called Add(string)");
}
public void Add(int x, int y)
{
Console.WriteLine("Called Add(int, int)");
}
}
Puede usar:
DummyCollection foo = new DummyCollection
{
"Hi",
"There",
{ 1, 2 }
};
(Por supuesto, normalmente querrías que tu colección implementara IEnumerable
correctamente ...)
Iniciales de objetos y colecciones de lectura (Guía de programación de C #) . Básicamente puedes hacer esto con cada tipo personalizado que sea una lista (implementa IEnumerable).
Se llaman inicializadores de colecciones (también ver here ), y la forma en que funcionan es buscando un método Add()
que pueda hacer sus pujas. Llama a Add()
para cada uno de los enteros que tiene en sus llaves.
La búsqueda del método Add()
es pura magia del compilador. Está codificado para encontrar un método de ese nombre.