Effective C 精髓 (待續)

2021-08-22 01:53:14 字數 2740 閱讀 2434

昨天買了一本《effective c#》,看了幾個item,雖然沒有當初讀《effective c++》時的那般震撼,但是也收穫不少。把其中的要點記錄於下,有些條款加上了自己的理解,權當作讀書筆記吧 :-)

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不行。

(6)請注意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);

customercustomers

=(customer)dataentrance.getobjects(

typeof

(customer),wherestr);

arraylistcusnamelist

=new

arraylist();

foreach

(customercus

incustomers)

",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);

customercustomers

=(customer)dataentrance.getobjects(

typeof

(customer),wherestr);

this

.combobox1.datasource

=customers;

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

string

cusid

=this

.combobox1.selecteditem.tostring().split(''

)[0];customerdescus

=null

;foreach

(customercus

incustomers)}

現在,簡單多了,一行**搞定:)

customerdescus

=this

.combobox1.selecteditem

ascustomer;

Effective C 精髓 (待續)

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

《Effective C 精髓》摘選

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

《Effective C 精髓》摘選

item 1 always use properties instead of accessible data members 這個是地球人都知道的條款了。你需要記住,屬性是類的外部介面部分,而 公共 成員卻是內部實現。如果把內部實現暴露給外部,對於以後類的實現變更是非常不利的。item 2 pre...