Object Initializer

Object Initializer به شما اجازه می‌دهد، خاصیت‌ها را در داخل کلاس مقداردهي کنيد. اگر به عنوان مثال چندين خاصيت داشته باشيد و نخواهيد که يک سازنده را جهت مقداردهي به آنها تعريف کنيد، می‌توانید از object initializer استفاده نماييد. به عنوان مثال به کد زير توجه کنيد :

using System;

public class Sample
{
    public int    Property1 { get; set; }
    public string Property2 { get; set; }
    public bool   Property3 { get; set; }
}

public class Program
{
    public static void Main()
    {
        Sample sampleClass = new Sample();
        sampleClass.Property1 = 100;
        sampleClass.Property2 = "Sample";
        sampleClass.Property3 = true;
    }
}

همانطور که مشاهده می‌کنید، لازم است که مقادير را تک به تک به خاصیت‌ها اختصاص دهيم. با استفاده از object initializers می‌توان کد را ساده‌تر کرد :

public class Program
{
    public static void Main()
    {
        Sample sampleClass = new Sample
        {
            Property1 = 100,
            Property2 = "Hello",
            Property3 = true
        };
    }
}

مشاهده می‌کنید که، بعد از ايجاد یک شیء از کلاس به جاي پرانتز از آکولاد استفاده کرده و سپس با ليست کردن خاصیت‌ها مقاديري را که لازم داريم، به آنها اختصاص می‌دهیم. به اين نکته نيز توجه کنيد که خواص به وسيله کاما از هم جدا می‌شوند. هنگام استفاده از object initializers سازنده پيشفرض بدون پارامتر قبل از هر خاصيت مقداردهي شده فراخواني می‌شود. از آنجاييکه سازنده پيشفرض قبل از اختصاص مقادير به خاصیت‌ها اجرا می‌شود، می‌توانید مقاديري پيشفرضي به هر يک از خواص اختصاص بدهيد، با اين کار لازم نيست که حتماً به همه خواص با استفاده از initializer مقدار اختصاص داده شود. اگر يه سازنده غير پيشفرض (non-default constructor) به کلاس اضافه کنيد باز هم بايد يک سازنده بدون پارامتر پيشفرض براي قدرت استفاده از object initializers وجود داشته باشد. می‌توان از object initializers تو در تو نيز استفاده نمود. فرض کنيد کلاس Sample مان يک خاصيت از نوع Animal که داراي دو خاصيت Name و Age هست را دارا می‌باشد.

Sample sampleClass = new Sample
{
    Property1 = 100,
    Property2 = "Hello",
    Property3 = true,
    Property4 = new Animal { Name = "Kitty", Age = 3 };
};

نوع ديگر از مقداردهنده ها collection initializers می‌باشند. collection initializers بسيار شبيه به array initializers می‌باشند با اين تفاوت که در کلکسیون‌های عمومي (generic) استفاده می‌شوند.

   1: using System;
   2: using System.Collections.Generic;
   3: 
   4: namespace ObjectInitializer
   5: {
   6:     class Person
   7:     {
   8:         public string FirstName { get; set; }
   9: 
  10:         public Person(string f)
  11:         {
  12:             FirstName = f;
  13:         }
  14:     }
  15: 
  16:     class Program
  17:     {
  18:         static void Main(string[] args)
  19:         {
  20:             List<Person> people = new List<Person>
  21:             {                                     
  22:                  new Person("John"),              
  23:                  new Person("Jenny"),             
  24:                  new Person("Joe")                
  25:             };                                    
  26: 
  27:             foreach (var person in people)
  28:             {
  29:                 Console.WriteLine(String.Format("{0}", person.FirstName));
  30:             }
  31:         }
  32:     }
  33: }
John
Jenny
Joe

کد زير نشان می‌دهد که بدون استفاده از collecition initializers، لازم بود که در خطوط 25-20 آیتم‌ها را به صورت دستی و با استفاده از متد ()Add اضافه کرده يا يک سازنده ايجاد کنيم، که آیتم‌هایی براي کلکسيون قبول کند.

List<Person> people = new List<Person>();

people.Add(new Person("John"));
people.Add(new Person("Jenny"));
people.Add(new Person("Joe"));