Новая функция инициализации объекта .NET 3.0 более гибкая, чем перегруженный конструктор. Вот простой пример:
public class Item
{
public string Name {get; set;}
public int Index {get; set;}
public string Caption {get; set;}
}
Как написано сейчас, мы можем сделать следующее в коде:
var x = new item {Name=”FooBar”};
var x = new item {Name=”FooBar”, Index=”1”, Caption=”Foo Bar”};
Я бы добавил перегруженный конструктор в класс Item, только если я хочу добавить функциональность во время инициализации свойства. Например:
public class Item
{
public Item() {}
public Item(string name)
{
Name = name;
Caption = name; //defaulting name to caption
}
public Item(string name, int index) : this(name)
{
Index = index;
}
public Item(string name, int index, string caption) : this(name, int)
{
Caption = caption;
}
public string Name {get; set;}
public int Index {get; set;}
public string Caption {get; set;}
}
Примечание. Если бы это был дочерний класс, я мог бы быть связан с родительским конструктором с ключевым словом base.
Если я пишу класс «конфигурации», я использую Fluent Methods вместо перегруженных конструкторов.
Например, если я добавил эти методы в класс Item:
public Item WithName(string name)
{
Name = name;
return this;
}
public Item WithIndex(int index)
{
Index = index;
return this;
}
public Item WithCaption(string caption)
{
Caption = caption;
return this;
}
Я мог бы написать такой код:
var x = new Item().WithName(“FooBar”).WithIndex(“99”).WithCaption(“Foo Bar”);