Inicializace objektů pomocí inicializátoru objektů (Průvodce programováním v C#)

Inicializátory objektů můžete použít k inicializaci objektů typu deklarativním způsobem bez explicitního vyvolání konstruktoru pro typ.

Následující příklady ukazují, jak používat inicializátory objektů s pojmenovanými objekty. Kompilátor zpracovává inicializátory objektů tak, že nejprve přistupuje k konstruktoru instance bez parametrů a pak zpracovává inicializace členů. Proto pokud je konstruktor bez parametrů deklarován jako private ve třídě, inicializátory objektů, které vyžadují veřejný přístup, selžou.

Pokud definujete anonymní typ, musíte použít inicializátor objektů. Další informace naleznete v tématu Jak vrátit podmnožinu vlastností elementu v dotazu.

Příklad

Následující příklad ukazuje, jak inicializovat nový StudentName typ pomocí inicializátorů objektů. Tento příklad nastaví vlastnosti v StudentName typu:

public class HowToObjectInitializers
{
    public static void Main()
    {
        // Declare a StudentName by using the constructor that has two parameters.
        StudentName student1 = new StudentName("Craig", "Playstead");

        // Make the same declaration by using an object initializer and sending
        // arguments for the first and last names. The parameterless constructor is
        // invoked in processing this declaration, not the constructor that has
        // two parameters.
        StudentName student2 = new StudentName
        {
            FirstName = "Craig",
            LastName = "Playstead"
        };

        // Declare a StudentName by using an object initializer and sending
        // an argument for only the ID property. No corresponding constructor is
        // necessary. Only the parameterless constructor is used to process object
        // initializers.
        StudentName student3 = new StudentName
        {
            ID = 183
        };

        // Declare a StudentName by using an object initializer and sending
        // arguments for all three properties. No corresponding constructor is
        // defined in the class.
        StudentName student4 = new StudentName
        {
            FirstName = "Craig",
            LastName = "Playstead",
            ID = 116
        };

        Console.WriteLine(student1.ToString());
        Console.WriteLine(student2.ToString());
        Console.WriteLine(student3.ToString());
        Console.WriteLine(student4.ToString());
    }
    // Output:
    // Craig  0
    // Craig  0
    //   183
    // Craig  116

    public class StudentName
    {
        // This constructor has no parameters. The parameterless constructor
        // is invoked in the processing of object initializers.
        // You can test this by changing the access modifier from public to
        // private. The declarations in Main that use object initializers will
        // fail.
        public StudentName() { }

        // The following constructor has parameters for two of the three
        // properties.
        public StudentName(string first, string last)
        {
            FirstName = first;
            LastName = last;
        }

        // Properties.
        public string? FirstName { get; set; }
        public string? LastName { get; set; }
        public int ID { get; set; }

        public override string ToString() => FirstName + "  " + ID;
    }
}

Inicializátory objektů lze použít k nastavení indexerů v objektu. Následující příklad definuje BaseballTeam třídu, která používá indexer k získání a nastavení hráčů na různých pozicích. Inicializátor může přiřadit hráče na základě zkratky pozice nebo čísla použitého pro každou pozici baseballové přehledy výkonnostních metrik:

public class HowToIndexInitializer
{
    public class BaseballTeam
    {
        private string[] players = new string[9];
        private readonly List<string> positionAbbreviations = new List<string>
        {
            "P", "C", "1B", "2B", "3B", "SS", "LF", "CF", "RF"
        };

        public string this[int position]
        {
            // Baseball positions are 1 - 9.
            get { return players[position-1]; }
            set { players[position-1] = value; }
        }
        public string this[string position]
        {
            get { return players[positionAbbreviations.IndexOf(position)]; }
            set { players[positionAbbreviations.IndexOf(position)] = value; }
        }
    }

    public static void Main()
    {
        var team = new BaseballTeam
        {
            ["RF"] = "Mookie Betts",
            [4] = "Jose Altuve",
            ["CF"] = "Mike Trout"
        };

        Console.WriteLine(team["2B"]);
    }
}

Viz také