Acest articol este dedicat unei functionalitati din versiunea 3.0 a limbajului C# si anume, object initializer. Vom examina modul cum se initializau obiectele pana la aparitia acestei caracteristici si cat de utila este in programare.
Construim clasa Report.
/// <summary>
/// class Report
/// </summary>
public class Report
{
/// <summary>
/// report's title
/// </summary>
public string Title { get; set; }
/// <summary>
/// report's date
/// </summary>
public DateTime Date { get; set; }
/// <summary>
/// report's number
/// </summary>
public int Number { get; set; }
/// <summary>
/// default constructor
/// </summary>
public Report()
{
}
/// <summary>
/// constructor with parameters for class properties
/// </summary>
public Report(string title, DateTime date, int number)
{
Title = title;
Date = date;
Number = number;
}
}
Urmatoarele modalitati de scriere sunt des intalnite:
//instantiate the object
Report report = new Report();
//set properties
report.Title = "Articles";
report.Date = DateTime.Now;
report.Number = 123;
//--------
Report report = new Report("Articles", DateTime.Now, 124);
In C# 3.0 apare notiunea de object initalizer. Aceasta permite constructia si initializarea intr-un mod usor si contine valorile care vor fi atribuite membrilor noului obiect creat.
//use of object initializer
var report = new Report
{
Title = "Articles",
Date = DateTime.Now,
Number = 123
};
Expresia de mai sus este executata in doi pasi: invocarea contructorului (crearea obiectului) si initializarea membrilor cu valorile specificate.
In cazul in care constructorul implicit este privat, object initializer va genera eroare.
‘ObjectInitializer.Report.Report()’ is inaccessible due to its protection level.
Tipurile anonime trebuie declarate cu ajutorul unui object initializer, pentru ca doar acesta le poate instantia.
var car = new { Year = 2011, Color = "Yellow" };
Campurile care nu sunt specificate vor avea valori implicite.
In cadrul colectiilor se pot folosi mai multe elemente de initializare, fara a mai fi nevoie de apelul metodei Add (compilatorul va face acest lucru).
List<Report> reportList = new List<Report>()
{
new Report { Date = DateTime.Now, Number = 124, Title = "Agents" },
new Report { Date = DateTime.Now, Number = 125, Title = "Warehouses" }
};
In cazul in care programatorul scrie propria colectie, aceasta trebuie sa implementeze interfata ICollection
Object initializer furnizeaza o sintaxa noua, simpla, care combina crearea obiectuui si initializarea lui intr-un singur pas. Chiar daca acelasi lucru este scris cu mai putin cod, in ceea ce priveste performanta se poate spune ca diferenta este minora (nu se mai aloca spatiu pentru variabila locala), instructiunile IL fiind aceleasi.
zeltera says:
Foarte utila aceasta facilitate.