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