C# Language Inizializzatori dell'indice

Esempio

Gli inizializzatori dell'indice consentono di creare e inizializzare oggetti con indici contemporaneamente.

Ciò semplifica l'inizializzazione dei dizionari:

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

Qualsiasi oggetto che abbia un getter o setter indicizzato può essere usato con questa sintassi:

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

Produzione:

Indice: foo, valore: 34
Indice: bar, valore: 42

Visualizza la demo

Se la classe ha più indicizzatori è possibile assegnarli tutti in un singolo gruppo di istruzioni:

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

Produzione:

Indice: foo, valore: 34
Indice: bar, valore: 42
Indice: 10, valore: dieci
Indice: 42, valore: significato della vita

Va notato che l'accessore del set dell'indicizzatore potrebbe comportarsi in modo diverso rispetto a un metodo Add (utilizzato negli inizializzatori della raccolta).

Per esempio:

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

contro:

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