Effective C# 使用成員初始化器而不是賦值語(yǔ)句
更新時(shí)間:2012年11月07日 16:33:12 作者:
一般情況下,一個(gè)類都會(huì)有多個(gè)構(gòu)造函數(shù)。隨著時(shí)間的推移,成員變量、構(gòu)造函數(shù)不斷增加
一般情況下,一個(gè)類都會(huì)有多個(gè)構(gòu)造函數(shù)。隨著時(shí)間的推移,成員變量、構(gòu)造函數(shù)不斷增加。為了處理這種情況最方便的辦法就是:在聲明變量的時(shí)候進(jìn)行初始化,而不是在每個(gè)構(gòu)造函數(shù)中進(jìn)行。無(wú)論是類成員(靜態(tài)變量)合適實(shí)例變量,我們都應(yīng)該充分利用初始化器的語(yǔ)法。
C#編程在,一般在聲明一個(gè)變量的同時(shí)我們會(huì)對(duì)其進(jìn)行初始化:
1 class Employee
2 {
3 private List<Employee> empList = new List<Employee>();
4 }
不論我們?yōu)镋mployee類添加了多少個(gè)構(gòu)造函數(shù),empList變量都能夠被正確的初始化,這是因?yàn)椋?
編譯器會(huì)在所有的構(gòu)造函數(shù)(包括默認(rèn)構(gòu)造函數(shù))的最開(kāi)始位置生成代碼來(lái)為所以的實(shí)例成員變量定義初始化器(進(jìn)行初始化);所以我們不需要再構(gòu)造函數(shù)中為每一個(gè)定義的成員變量添加初始化代碼——直接在聲明的時(shí)候初始化即可。
初始化器可以看做是構(gòu)造函數(shù)中初始化語(yǔ)句的另一種表示。初始化器生成的代碼會(huì)插入到構(gòu)造函數(shù)代碼前面執(zhí)行。初始化器將在為類型執(zhí)行調(diào)用基類構(gòu)造函數(shù)之前執(zhí)行,其順序與類成員變量聲明的順序一樣。
C#的初始化器語(yǔ)法是一種最簡(jiǎn)單的、能夠避免類型中存在未初始化變量的解決辦法。但是在下面的三種情況下應(yīng)該避免使用初始化器:
1.初始化對(duì)象為0或null時(shí)
因?yàn)橄到y(tǒng)默認(rèn)的初始化會(huì)將會(huì)在所有代碼執(zhí)行前把一切都設(shè)置成0或者null(值類型和引用類型)。而且這一步的操作是位于很底層的實(shí)現(xiàn),我們也可以直接將對(duì)象賦值設(shè)置為0或null,但是顯然這是多余的。
2.對(duì)同一個(gè)變量執(zhí)行不同的初始化方式
使用初始化語(yǔ)句的一個(gè)前提是:所有得構(gòu)造函數(shù)都將為該變量設(shè)置同樣的值。我們看下面的示例代碼:
class Employee
{
//聲明變量的同時(shí)進(jìn)行初始化
private List<Employee> empList = new List<Employee>();
public Employee()
{
}
public Employee(int size)
{
empList = new List<Employee>(size);
}
}
在上面的代碼中,當(dāng)我們調(diào)用第二個(gè)構(gòu)造函數(shù)創(chuàng)建初始化指定大小的泛型集合時(shí) ,實(shí)際上時(shí)創(chuàng)建了兩個(gè)List<Employee>。第一個(gè)創(chuàng)建后馬上變成了垃圾——這是由于初始化器將在所有構(gòu)造函數(shù)之前執(zhí)行。編譯器生成的代碼類似于下面的這段代碼:
class Employee
{
//聲明變量
private List<Employee> empList;
public Employee()
{
empList = new List<Employee>();
}
public Employee(int size)
{
empList = new List<Employee>();
empList = new List<Employee>(size);
}
}
我們可以看到這樣做會(huì)影響程序的效率,創(chuàng)建了不必要的對(duì)象,所以如果需要在不同的構(gòu)造函數(shù)中執(zhí)行不同的初始化方式時(shí)正確的做法應(yīng)該是不適用初始化器,而是先聲明變量,然后在構(gòu)造函數(shù)中進(jìn)行成員變量的初始化,如下:
class Employee
{
//聲明變量
private List<Employee> empList;
public Employee()
{
empList = new List<Employee>();
}
public Employee(int size)
{
empList = new List<Employee>(size);
}
}
3.需要進(jìn)行異常處理
初始化器無(wú)法被try語(yǔ)句包裹。所以對(duì)象初始化器執(zhí)行的過(guò)程中發(fā)生異常都會(huì)被傳遞到對(duì)象之外。如果在初始化對(duì)象的時(shí)候可能會(huì)拋出異常時(shí)我們應(yīng)該將這部分代碼放到構(gòu)造函數(shù)中,對(duì)其進(jìn)行異常處理。這樣才能夠?qū)崿F(xiàn)必要的恢復(fù)性代碼,以創(chuàng)建類型實(shí)例并以更友好的方式處理異常。
小節(jié):
成員初始化器是保證類型中成員變量都被初始化的最簡(jiǎn)單方法——在聲明變量時(shí)就對(duì)其進(jìn)行初始化,無(wú)論調(diào)用的是那個(gè)構(gòu)造函數(shù),初始化器都將會(huì)在所有構(gòu)造函數(shù)之前執(zhí)行。這種語(yǔ)法也避免了在添加新的構(gòu)造函數(shù)時(shí)遺漏掉重要的初始化代碼。所以,如果對(duì)于所有的構(gòu)造函數(shù)某個(gè)成員變量的初始化值是一樣的,那么就應(yīng)該盡量使用初始化器語(yǔ)法。
C#編程在,一般在聲明一個(gè)變量的同時(shí)我們會(huì)對(duì)其進(jìn)行初始化:
復(fù)制代碼 代碼如下:
1 class Employee
2 {
3 private List<Employee> empList = new List<Employee>();
4 }
不論我們?yōu)镋mployee類添加了多少個(gè)構(gòu)造函數(shù),empList變量都能夠被正確的初始化,這是因?yàn)椋?
編譯器會(huì)在所有的構(gòu)造函數(shù)(包括默認(rèn)構(gòu)造函數(shù))的最開(kāi)始位置生成代碼來(lái)為所以的實(shí)例成員變量定義初始化器(進(jìn)行初始化);所以我們不需要再構(gòu)造函數(shù)中為每一個(gè)定義的成員變量添加初始化代碼——直接在聲明的時(shí)候初始化即可。
初始化器可以看做是構(gòu)造函數(shù)中初始化語(yǔ)句的另一種表示。初始化器生成的代碼會(huì)插入到構(gòu)造函數(shù)代碼前面執(zhí)行。初始化器將在為類型執(zhí)行調(diào)用基類構(gòu)造函數(shù)之前執(zhí)行,其順序與類成員變量聲明的順序一樣。
C#的初始化器語(yǔ)法是一種最簡(jiǎn)單的、能夠避免類型中存在未初始化變量的解決辦法。但是在下面的三種情況下應(yīng)該避免使用初始化器:
1.初始化對(duì)象為0或null時(shí)
因?yàn)橄到y(tǒng)默認(rèn)的初始化會(huì)將會(huì)在所有代碼執(zhí)行前把一切都設(shè)置成0或者null(值類型和引用類型)。而且這一步的操作是位于很底層的實(shí)現(xiàn),我們也可以直接將對(duì)象賦值設(shè)置為0或null,但是顯然這是多余的。
2.對(duì)同一個(gè)變量執(zhí)行不同的初始化方式
使用初始化語(yǔ)句的一個(gè)前提是:所有得構(gòu)造函數(shù)都將為該變量設(shè)置同樣的值。我們看下面的示例代碼:
復(fù)制代碼 代碼如下:
class Employee
{
//聲明變量的同時(shí)進(jìn)行初始化
private List<Employee> empList = new List<Employee>();
public Employee()
{
}
public Employee(int size)
{
empList = new List<Employee>(size);
}
}
在上面的代碼中,當(dāng)我們調(diào)用第二個(gè)構(gòu)造函數(shù)創(chuàng)建初始化指定大小的泛型集合時(shí) ,實(shí)際上時(shí)創(chuàng)建了兩個(gè)List<Employee>。第一個(gè)創(chuàng)建后馬上變成了垃圾——這是由于初始化器將在所有構(gòu)造函數(shù)之前執(zhí)行。編譯器生成的代碼類似于下面的這段代碼:
復(fù)制代碼 代碼如下:
class Employee
{
//聲明變量
private List<Employee> empList;
public Employee()
{
empList = new List<Employee>();
}
public Employee(int size)
{
empList = new List<Employee>();
empList = new List<Employee>(size);
}
}
我們可以看到這樣做會(huì)影響程序的效率,創(chuàng)建了不必要的對(duì)象,所以如果需要在不同的構(gòu)造函數(shù)中執(zhí)行不同的初始化方式時(shí)正確的做法應(yīng)該是不適用初始化器,而是先聲明變量,然后在構(gòu)造函數(shù)中進(jìn)行成員變量的初始化,如下:
復(fù)制代碼 代碼如下:
class Employee
{
//聲明變量
private List<Employee> empList;
public Employee()
{
empList = new List<Employee>();
}
public Employee(int size)
{
empList = new List<Employee>(size);
}
}
3.需要進(jìn)行異常處理
初始化器無(wú)法被try語(yǔ)句包裹。所以對(duì)象初始化器執(zhí)行的過(guò)程中發(fā)生異常都會(huì)被傳遞到對(duì)象之外。如果在初始化對(duì)象的時(shí)候可能會(huì)拋出異常時(shí)我們應(yīng)該將這部分代碼放到構(gòu)造函數(shù)中,對(duì)其進(jìn)行異常處理。這樣才能夠?qū)崿F(xiàn)必要的恢復(fù)性代碼,以創(chuàng)建類型實(shí)例并以更友好的方式處理異常。
小節(jié):
成員初始化器是保證類型中成員變量都被初始化的最簡(jiǎn)單方法——在聲明變量時(shí)就對(duì)其進(jìn)行初始化,無(wú)論調(diào)用的是那個(gè)構(gòu)造函數(shù),初始化器都將會(huì)在所有構(gòu)造函數(shù)之前執(zhí)行。這種語(yǔ)法也避免了在添加新的構(gòu)造函數(shù)時(shí)遺漏掉重要的初始化代碼。所以,如果對(duì)于所有的構(gòu)造函數(shù)某個(gè)成員變量的初始化值是一樣的,那么就應(yīng)該盡量使用初始化器語(yǔ)法。
相關(guān)文章
Blazor實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證
這篇文章介紹了Blazor實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證的方式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01.Net行為型設(shè)計(jì)模式之迭代器模式(Iterator)
這篇文章介紹了.Net行為型設(shè)計(jì)模式之迭代器模式(Iterator),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05ASP.NET?Core開(kāi)發(fā)環(huán)境安裝配置
這篇文章介紹了ASP.NET?Core開(kāi)發(fā)環(huán)境安裝配置,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02一步步打造漂亮的新聞列表(無(wú)刷新分頁(yè)、內(nèi)容預(yù)覽)第一步
新聞列表是信息管理系統(tǒng)中最常見(jiàn)的,也是最簡(jiǎn)單的,一些簡(jiǎn)單的新聞列表就是一個(gè)table,然后里面循環(huán)寫(xiě)入數(shù)據(jù)2010-07-07.Net創(chuàng)建型設(shè)計(jì)模式之工廠方法模式(Factory?Method)
這篇文章介紹了.Net設(shè)計(jì)模式之工廠方法模式(Factory?Method),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05IIS部署ASP.NET?Core項(xiàng)目及常見(jiàn)問(wèn)題總結(jié)
這篇文章介紹了IIS部署ASP.NET?Core項(xiàng)目的方法及常見(jiàn)問(wèn)題總結(jié),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01ASP.NET中Application、Cookie、Session、Cache和ViewState
本文主要介紹Application、Cookie、Session、Cache和ViewState,并總結(jié)了在什么情況下使用他們,希望對(duì)大家有所幫助。2016-04-04