《Effective C 精髓》摘選

2021-04-02 23:51:35 字數 2409 閱讀 4583

item 1: always use properties instead of accessible data members

這個是地球人都知道的條款了。你需要記住,屬性是類的外部介面部分,而(公共)成員卻是內部實現。如果把內部實現暴露給外部,對於以後類的實現變更是非常不利的。

item 2: prefer readonly to const

這個條款需要注意一下幾點:

(1)const在編譯期發生作用,即編譯器會將所有的const成員置換成對應的常量「值」。

(2)即使引用其他程式集中的const成員,本程式集中也是硬編碼了const成員的值。

(3)readonly在執行期被評估,所以其效能比const稍差,但是靈活性更高。

(4)const的值必須在編譯期決定,所以不能使用new為其賦值。

(5)更新乙個公有的const成員的值應被視為介面改變,而更新乙個readonly變數的值可視為內部實現的改變。

item 3: prefer the is or as operators to casts

(1)is或as稱為「動態轉換」,是嘗試性的,如果失敗,不會丟擲異常。盡可能使用as操作符。該機制使用元資料完成功能。

(2)cast稱為「強制轉換」,如果失敗,則丟擲異常--代價高昂。

(3)is、as、cast轉換都不會呼叫自定義的轉換操作符。

(4)is可以判斷乙個object是否為值型別,而as不行。

(5)請注意type.isassignablefrom()和type.issubclassof()方法,他們也是常用的「型別檢測」手段。注意,type.issubclassof()方法不支援介面檢測,而type.isassignablefrom()支援。

item 4: use conditional attributes instead of #if

使用#if常(可能)導致效能問題(如空方法呼叫)和程式對#if/#endif塊**的依賴問題。

(1)使用conditional attributes修飾的方法總是會被編譯到目標程式集中,無論是release或debug。

(2)如果條件不滿足該conditional attributes指定的條件,則編譯器會忽略所有對其修飾的方法的呼叫。

(3)被conditional attributes修飾的方法必須返回void,這是有道理的。因為我們的程式執行不能依賴被conditional attributes修飾的方法的返回值。否則,在不同的條件下,我們的程式將表現出非我們期望的不用行為。

item 5: always provide tostring()

關於這一點,我在以往的專案中早有體會。舉個例子,曾經我們需要把從資料庫中取出的customer列表繫結到combobox,開始時我們設計customer時並沒有重寫tostring()方法,所以我們要這樣做:

//從資料庫中挑出所有有效使用者

string wherestr = string.format("where = '1'" ,customer._isvalid) ;

customer customers = (customer)dataentrance.getobjects(typeof(customer) ,wherestr) ;

arraylist cusnamelist = new arraylist() ;

foreach(customer cus in customers)

" ,cus.id ,cus.name)) ;

}//繫結

this.combobox1.datasource = cusnamelist ;

如果為customer重寫tostring()方法,

#region tostring

public override string tostring()

#endregion

則只需要這樣:

string wherestr = string.format("where = '1'" ,customer._isvalid) ;

customer customers = (customer)dataentrance.getobjects(typeof(customer) ,wherestr) ;

this.combobox1.datasource = customers ;

這樣就簡便了好多,而且這樣做還有乙個好處,比如,從combobox從選取乙個客戶時,以前需要這樣:

string cusid = this.combobox1.selecteditem.tostring().split(' ')[0] ;

customer descus = null ;

foreach(customer cus in customers)

}現在,簡單多了,一行**搞定。

customer descus = this.combobox1.selecteditem as customer ;

《Effective C 精髓》摘選

昨天買了一本 effective c 看了幾個item,雖然沒有當初讀 effective c 時的那般震撼,但是也收穫不少。把其中的要點記錄於下,有些條款加上了自己的理解,權當作讀書筆記吧 item 1 always use properties instead of accessible dat...

《Effective C 精髓》摘選

http dev.21tx.com 2005年12月21日 zhuweisky 昨天買了一本 effective c 看了幾個item,雖然沒有當初讀 effective c 時的那般震撼,但是也收穫不少。把其中的要點記錄於下,有些條款加上了自己的理解,權當作讀書筆記吧 item 1 always ...

Effective C 精髓 (待續)

昨天買了一本 effective c 看了幾個item,雖然沒有當初讀 effective c 時的那般震撼,但是也收穫不少。把其中的要點記錄於下,有些條款加上了自己的理解,權當作讀書筆記吧 item 1 always use properties instead of accessible dat...