Initiera objekt med hjälp av en objektinitierare (C#-programmeringsguide)

Du kan använda objektinitierare för att initiera typobjekt på ett deklarativt sätt utan att uttryckligen anropa en konstruktor för typen.

I följande exempel visas hur du använder objektinitierare med namngivna objekt. Kompilatorn bearbetar objektinitierare genom att först komma åt den parameterlösa instanskonstruktorn och sedan bearbeta medlemsinitieringarna. Om den parameterlösa konstruktorn deklareras som private i klassen misslyckas därför objektinitierare som kräver offentlig åtkomst.

Du måste använda en objektinitierare om du definierar en anonym typ. Mer information finns i Returnera delmängder av elementegenskaper i en fråga.

Exempel

I följande exempel visas hur du initierar en ny StudentName typ med hjälp av objektinitierare. I det här exemplet anges egenskaper i typen StudentName :

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

Objektinitierare kan användas för att ange indexerare i ett objekt. I följande exempel definieras en BaseballTeam klass som använder en indexerare för att hämta och ange spelare på olika positioner. Initieraren kan tilldela spelare, baserat på förkortningen för positionen, eller antalet som används för varje position baseball styrkort:

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

Se även