C# Language Inicializadores de índice


Ejemplo

Los inicializadores de índice permiten crear e inicializar objetos con índices al mismo tiempo.

Esto hace que inicializar diccionarios sea muy fácil:

var dict = new Dictionary<string, int>()
{
    ["foo"] = 34,
    ["bar"] = 42
};

Cualquier objeto que tenga un getter o setter indexado se puede usar con esta sintaxis:

class Program
{
    public class MyClassWithIndexer
    {
        public int this[string index]
        {
            set
            {
                Console.WriteLine($"Index: {index}, value: {value}");
            }
        }
    }

    public static void Main()
    {
        var x = new MyClassWithIndexer()
        {
            ["foo"] = 34,
            ["bar"] = 42
        };

        Console.ReadKey();
    }
}

Salida:

Índice: foo, valor: 34
Índice: barra, valor: 42

Ver demostración

Si la clase tiene varios indizadores, es posible asignarlos a todos en un solo grupo de declaraciones:

class Program
{
    public class MyClassWithIndexer
    {
        public int this[string index]
        {
            set
            {
                Console.WriteLine($"Index: {index}, value: {value}");
            }
        }
        public string this[int index]
        {
            set
            {
                Console.WriteLine($"Index: {index}, value: {value}");
            }
        }
    }

    public static void Main()
    {
        var x = new MyClassWithIndexer()
        {
            ["foo"] = 34,
            ["bar"] = 42,
            [10] = "Ten",
            [42] = "Meaning of life"
        };
    }
}

Salida:

Índice: foo, valor: 34
Índice: barra, valor: 42
Índice: 10, valor: diez
Índice: 42, valor: Significado de la vida.

Se debe tener en cuenta que el descriptor de acceso al set del indexador podría comportarse de manera diferente en comparación con un método Add (utilizado en inicializadores de colección).

Por ejemplo:

var d = new Dictionary<string, int>
{
    ["foo"] = 34,
    ["foo"] = 42,
}; // does not throw, second value overwrites the first one

versus:

var d = new Dictionary<string, int>
{
    { "foo", 34 },
    { "foo", 42 },
}; // run-time ArgumentException: An item with the same key has already been added.