程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則4:用條件屬性而不是#if預編譯塊(3)

Effective C#原則4:用條件屬性而不是#if預編譯塊(3)

編輯:關於C語言

Conditional屬性會告訴C#編譯器,這個方法只在編譯環境變量 DEBUG有定義時才被調用。同時,Conditional屬性不會影響CheckState()函數生 成的代碼,只是修改對函數的調用。如果DEBGU標記被定義,你可以得到這:

public string LastName
{
 get
 {
   CheckState( );
  return _lastName;
 }
 set
 {
  CheckState( );
  _lastName = value;
   CheckState( );
 }
}

如果不是,你得到的就是這:

public string LastName
{
 get
 {
   return _lastName;
 }
 set
 {
  _lastName = value;
 }
}

不管環境變量的狀態如何, CheckState()的函數體是一樣的。這只是一個例子,它告訴你為什麼要弄明 白.Net裡編譯和JIT之間的區別。不管DEBUG環境變量是否被定義,CheckState() 方法總會被編譯且存在於程序集中。這或許看上去是低效的,但這只是占用一點 硬盤空間,CheckState()函數不會被載入到內存,更不會被JITed(譯注:這裡的 JITed是指真正的編譯為機器代碼),除非它被調用。它存在於程序集文件裡並不 是本質問題。這樣的策略是增強(程序的)可伸縮性的,並且這樣只是一點微不足 道的性能開銷。你可以通過查看.Net框架庫中Debug類而得到更深入的理解。在 任何一台安裝了.Net框架庫的機器上,System.dll程序集包含了Debug類的所有 方法的代碼。由環境變量在編譯時來決定是否讓由調用者來調用它們。

你同樣可以寫一個方法,讓它依懶於不只一個環境變量。當你應用多個環境變量 來控制條件屬性時,他們時以or的形式並列的。例如,下面這個版本的 CheckState會在DEBUG或者TRACE為真時被調用:

[ Conditional( "DEBUG" ),
 Conditional( "TRACE" ) ]
private void CheckState( )

如果要產生一個and的並列條件 屬性,你就要自己事先直接在代碼裡使用預處理命令定義一個標記:

#if ( VAR1 && VAR2 )
#define BOTH
#endif

是的,為了創建一個依懶於前面多個環境變量的條件例 程(conditional routine),你不得不退到開始時使用的#if實踐中了。#if為我 們產生一個新的標記,但避免在編譯選項內添加任何可運行的代碼。

Conditional屬性只能用在方法的實體上,另外,必須是一個返回類型為 void的方法。你不能在方法內的某個代碼塊上使用Conditional,也不能在一個 有返回值的方法上使用Conditional屬性。取而代之的是,你要細心構建一個條 件方法,並在那些方法上廢棄條件屬性行為。你仍然要回顧一下那些具有條件屬 性的方法,看它是否對對象的狀態具有副作用。但Conditional屬性在安置這些 問題上比#if/#endif要好得多。在使用#if/#endif塊時,你很可能錯誤的移除了 一個重要的方法調用或者一些配置。

前面的例子合用預先定義的DEBUG或 者TRACE標記,但你可以用這個技巧,擴展到任何你想要的符號上。Conditional 屬性可以由定義標記來靈活的控制。你可以在編譯命令行上定義,也可以在系統 環境變量裡定義,或者從源代碼的編譯選擇裡定義。

使用Conditional屬 性可以比使用#if/#endif生成更高效的IL代碼。在專門針對函數時,它更有優勢 ,它會強制你在條件代碼上使用更好的結構。編譯器使用Conditional屬性來幫 助你避免因使用#if/#endif而產生的常見的錯誤。條件屬性比起預處理,它為你 區分條件代碼提供了更好的支持。

小結:翻譯了幾篇了 ,感覺書寫的有點冗余,有些問題可以很簡單的說明的。可能是我的理解不到位 ,總之,感覺就是一個問題說來說去。另外,這裡例舉的幾個例子感覺也不是很 好,特別是前一個Item裡的強制轉化,感覺很牽強。不管怎樣,還是認真的把書 讀好,譯好吧。

返回教程目錄

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