《C#本质论》读书笔记(十二)构造器 @ Lennon
在C#里,很多人可能對屬性這個概念很熟悉,平時屬性是最常用到的.而我們很少會去用到構造器.而且很多人對構造器的一些概念還不是很熟悉,也有人認為屬性等同于構造器.今天在這里談談構造器的聲明.構造器重載.默認構造器.構造器與屬性的區別等..
?
構造器的聲明
?
class Employee{
public Employee(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public string FirstName { get;set;}
public string LastName { get; set;}
public string Salary { get;set;}
}
?
?
???????? 為了定義構造器,要創建一個沒有返回類型的方法,而且方法名必須完全和類名相同。
???????? 構造器是用來創建對象實例的方法。在這個例子中,構造器獲取員工的名字和姓氏作為參數,允許程序員在實例化Employee對象的時候指定這些參數的值。
?
調用構造器
?
class Program{
static void Main()
{
Employee employee;
employee = new Employee("Inigo","Montoya");
employee.Salary = "Too Little";
System.Console.WriteLine("{0}{1}:{2}",
employee.FirstName, employee.LastName, employee.Salary);
}
}
????? 構造器返回的是被實例化的對象的類型(雖然在構造器的聲明或實現中沒有顯式地指定返回類型或使用返回語句)。此外,我們已經移除了名字和姓氏的初始化代碼,因為現在是在構造器內部進行初始化。
????? 開發者應注意到既在聲明中又在構造器內部進行賦值的情況。假如一個字段在聲明時被賦值,那么只有在這個賦值發生之后,構造器內部的賦值才會發生。所以,最終生效的是構造器內部的賦值,它會覆蓋聲明時的任何賦值。這可能會使一個粗心的人誤以為在一個對象實例化之后,字段的值是在聲明時賦予的。所以,有必要考慮一種編碼風格,避免在同一個類中,既有聲明時賦值,又在構造器中賦值。
?
默認構造器
??????一旦顯式地添加了構造器,那么在Main()中實例化一個Employee時,就必須指定參數的值。
????? 假如一個類沒有顯示地定義任何構造器,C#編譯器會在編譯時自動添加一個。這個構造器不獲取參數,所以按照定義來說,它是默認構造器。而一旦為一個類顯式添加了一個構造器,C#編譯器就不再自動提供默認構造器。因此,在定義了Employee(string firstName,string lastName)之后,編譯器不在添加默認構造器employee()。雖然可以顯式地添加這樣的一個構造器,但這樣一來,就會再次允許構造一個沒有指定員工姓名的employee對象。
?
對象初始化器
??????? C#3.0新特性中增加了一個名為“對象初始化器”的特性。它能初始化一個對象中的所有允許訪問的字段和屬性。具體地說,在創建對象的構造器調用之后,你現在可以增加一對大括號,并在其中添加一個成員初始化列表。每個成員的初始化操作都是一個賦值操作,等號左邊是一個允許訪問的字段屬性,右邊則是具體要賦的值。
?
class Program{
static void Main()
{
Employee employee = new Employee("Inigo","Montoya")
{
Title = "Computer Nerd",Salary = "Not enough"
};
}
}
?
?
??????? 在使用一個對象初始化器的時候,要遵守相同的構造器規則。事實上,這只是一項語法上的改進,最終生成CIL代碼和用單獨的語句對字段及屬性進行賦值無異。在C#語言中,成員初始化器的順序,決定了在CIL代碼的構造器調用之后的語句中,對屬性和字段進行賦值的順序。
?
集合初始化器
?????? 采用和對象初始化器相似的語法,集合初始化器能簡化集合的創建。具體地說,使用集合初始化器,可以在集合實例化期間為集合內部的項賦值。借鑒數組的語法,集合初始化器會初始化集合中的每一項。例如,為了初始化一個Employee列表,需要在構造器調用之后添加一對大括號,并在大括號內部指定每一項。
?
class Program{
static void Main()
{
List<Employee> employee = new List<Employee>()
{
new Employee("Inigo","Montoya"),
new Employee("Chuck","McAtee")
};
}
}
?
?
????????? 如果像這樣為一個新的集合實例賦值,編譯器生成的代碼會按順序實例化每個對象,并通過Add()方法把它們添加到集合中。
?
終結器
????? 構造器定義了一個類在實例化過程中發生的事情。為了定義對象在銷毀過程中發生的事情,C#提供了終結器構造。與C++的析構器不同,終結器不是在對一個對象的所有引用都消失之后就馬上運行。相反,終結器是在一個對象最后一次活動之后,并在程序終止之前執行。具體地說,垃圾回收器會在一次垃圾回收過程中識別出帶有終結器的對象。之后,它并不是立即回收這些對象,而是將它們添加到一個終結隊列中。一個獨立的線程遍歷終結隊列中的每一個對象,調用它們的終結器,然后把它們從隊列中刪除,使它們再次可供垃圾回收器使用。
?
構造器的重載
????? 構造器是可以重載的--可以同時存在多個構造器,只要參數的數量和類型有所區別。
?
class Employee{
public Employee(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
public Employee(int id, string firstNmae, string lastName)
{
Id = id;
FirstName = firstName;
LastName = lastName;
}
public Employee(int id)
{
Id = id;
}
public int Id{get;set;}
public string FirstName { get;set;}
public string LastName { get;set;}
public string Salary { get;set;}
}
?
轉載于:https://www.cnblogs.com/aipeiyi/archive/2010/08/20/1804628.html
總結
以上是生活随笔為你收集整理的《C#本质论》读书笔记(十二)构造器 @ Lennon的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈谈基于SQL Server 的Exce
- 下一篇: Programming C#.Class