程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則12:選擇變量初始化而不是賦值語句(1)

Effective C#原則12:選擇變量初始化而不是賦值語句(1)

編輯:關於C語言
譯注:根據我個人對文章的理解,我把initializer譯為:初始化器,它是 指初始化語法,也就是在一個類裡聲明變量的同時,直接創建實例值的方法。

例:object m_o = new object();如果這段代碼不在任何函數內,但在 一個類裡,它就是一個初始化器,而不管你是把它放在類的開始還以結尾。)

一些類經常不只一個構造函數。時間一長,就難得讓它的成員變量以及 構造函數進行同步了。最好的確保這樣的事不會發生的方法就是:在聲明就是的 時間就直接初始化,而不是在每個構造函數內進行賦值。而且你應該使用初始化 器語法同時為靜態的和實例的變量進行初始化。

在C#裡,當你聲明一個 變量時就自然的構造了這個成員變量。直接賦值:

public class MyClass
{
 // declare the collection, and initialize it.
 private ArrayList _coll = new ArrayList( );
}

忽 略你最終會給MyClass添加多少個構造函數,_coll會正確的初始化。編譯器會產 生一些代碼,使得在你的任何一個構造函數調用前,都會初始化你聲明的實例變 量。當你添加一個新的構造函數時,_coll就給你初始化了。當你添加了一個新 的變量,你不用在所有的構造函數裡添加初始化代碼;直接在聲明的地方對它進 行初始化就行了。同樣重要的是:如果你沒有明確的聲明任何一個構造函數,編 譯會默認的給你添加一個,並且把所有的變量初始化過程都添加到這個構造函數 裡。

初始化器更像是一個到構造函數的方便的快捷方法。初始化生成的 代碼會放置在類型的構造函數之前。初始化會在執行類型的基類的構造函數之前 被執行,並且它們是按你聲明的先後關系順序執行的。

使用初始化器是 一個最簡單的方法,在你的類型裡來避免使用一些沒有賦值的變量,但這並不是 很好。下面三種情況下,你不應該使用初始化器語法。首先就是,如果你是初始 化一個對象為0,或者為null。系統默認會在你任何代碼執行前,為所有的內容 都初始化為0。系統置0的初始化是基於底層的CPU指令,對整個內存塊設置。你 的任何其它置0的初始化語句是多余的。C#編譯器忠實的添加額外的指令把內存 設置為0。這並沒有錯,只是效率不高。事實上,如果是處理值類型數據,這是 很不值的:

MyValType _MyVal1; // initialized to 0
MyValType _MyVal2 = new MyValType(); // also 0

兩條語句 都是把變量置為0。第一個是通過設置包含_MyVal1的內存來置0;而第二個是通過 IL指令initobj,這對變量_MyVal2會產生裝箱與拆箱操作。這很要花一點額外的 時間(參見原則17)。

第二個低效率的是在你為一個對象添加兩個構造函 數時會產生。你使用初始化器初始化變量,而所有的構造函數也對這些變量進行 了初始化。這個版本的MyClass兩個不同的ArrayList對象在它的構造函數內:

public class MyClass
{
 // declare the collection, and initialize it.
 private ArrayList _coll = new ArrayList( );
 MyClass( )
 {
 }
 MyClass( int size )
 {
  _coll = new ArrayList( size );
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved