昨天買了一本《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...