C#物件導向程式設計(七){功能型修飾詞<下>}

繼上篇之後,把剩下未說明的修飾詞再做一些整理,而後篇的這些修飾字實際上也是比較少用(不實用?可能就見仁見智),使用的時機當然還是視情況而定,以專案的規劃或需求來決定。c#

abstract 表示某一類別只是要做為其他類別的基底類別。
async 指出修改的方法、Lambda 運算式或匿名方法為非同步。
const 指定無法修改欄位值或區域變數值。
event 宣告事件。
extern 表示方法於外部實作。
new 明確隱藏繼承自基底類別的成員。
override 提供繼承自基底類別之虛擬成員的新實作。
Partial 定義同一組件內的部分類別、結構和方法。
readonly 宣告欄位只能做為宣告的一部分或在相同類別的建構函式中擁有指派的值。
sealed 指定不能繼承類別。
static 宣告成員,該成員屬於類型本身而不是屬於特定物件。
unsafe 宣告 unsafe 內容。
virtual 宣告方法或存取子的實作可藉由覆寫衍生類別中的成員變更。
volatile 表示欄位可以在程式中藉由像是作業系統、硬體或是同時執行的執行緒進行修改。

 

  • async
    可將方法、Lambda 運算式或匿名方法指定為非同步,使用  await 關鍵字進行可能需要長期執行的工作。非同步對於可能在像是應用程式存取 Web 資源的速度有時會變慢或延遲。 如果在同步處理序中遭到封鎖,整個應用程式就必須等候。 在非同步處理序中,應用程式可以繼續處理其他與 Web 資源不相關的工作,直到可能的封鎖工作完成。
    下表為非同步程式設計會改善回應速度的部分。
應用 包含非同步方法的支援 API
Web 存取 HttpClientSyndicationClient
處理檔案 StorageFileStreamWriterStreamReaderXmlReader
處理影像 MediaCaptureBitmapEncoderBitmapDecoder
WCF 程式設計 同步和非同步作業

ic612215

圖中的數字對應下列步驟。
1.事件處理常式會呼叫並等候 AccessTheWebAsync 非同步方法。
2.AccessTheWebAsync 會建立 HttpClient 執行個體並呼叫 GetStringAsync 非同步方法,將網站的內容當做字串下載。
3.GetStringAsync 中發生了導致進度暫停的一些狀況。 可能必須等待網站下載或其他封鎖活動。 為了避免封鎖資源,GetStringAsync 會將控制權遞交 (Yield) 給它的呼叫端 AccessTheWebAsync。
GetStringAsync 會傳回 Task (其中 TResult 是字串),而 AccessTheWebAsync 則會將工作指派給 getStringTask 變數。 工作代表對 GetStringAsync 之呼叫的進行中程序,並承諾會在工作完成時產生實際字串值。
4.因為尚未等候 getStringTask,所以 AccessTheWebAsync 可以繼續進行其他不相依於 GetStringAsync 之最終結果的其他工作。 這項工作是由對同步方法 DoIndependentWork 的呼叫來表示。
5.DoIndependentWork 是完成其工作並傳回其呼叫端的同步方法。
6.AccessTheWebAsync 已完成所有在未得到 getStringTask 結果的情況下,可處理的工作。 AccessTheWebAsync 接著要計算和傳回下載字串的長度,但是方法必須等到有字串時才能計算該值。
因此,AccessTheWebAsync 會使用 await 運算子暫停其進度,並將控制權遞交 (Yield) 給呼叫 AccessTheWebAsync 的方法。 AccessTheWebAsync 會將 Task(Of Integer) 或 Task<int> 傳回至呼叫端。 這項工作代表承諾會產生相當於下載字串長度的整數結果。在呼叫端 (在這個範例中是事件處理常式) 內,處理模式會持續進行。 呼叫端可能會在等候結果之前執行其他不取決於 AccessTheWebAsync 之結果的工作,或者呼叫端可能立即等候。事件處理常式會等候 AccessTheWebAsync,而 AccessTheWebAsync 會等候 GetStringAsync。
7.GetStringAsync 完成並產生字串結果。 字串結果不會依照您預期的方式透過呼叫 GetStringAsync 來傳回 (請記住,方法已在步驟 3 傳回工作)。字串結果會改為儲存在表示方法 getStringTask 完成的工作中。 await 運算子會從 getStringTask 擷取結果。 指派陳述式會將擷取的結果指派給 urlContents。
8.當 AccessTheWebAsync 擁有字串結果時,方法就可以計算字串的長度。 然後 AccessTheWebAsync 的工作也已完成,而且等候事件處理常式可以繼續執行。 在本主題最後的完整範例中,您可以確認事件處理常式會擷取並列印長度結果的值。

  • event
    event 關鍵字用來在發行者類別中宣告事件。事件是一種特殊的多點傳送委派,只能從宣告委派的類別或結構內叫用 (發暴者類別)。 如果其他類別或結構訂閱了事件,當發報者引發事件時,就會呼叫事件處理常式。

    Click() 取得位置的發報者


    接收端(訂閱者)

     
  • extern
    extern 修飾詞的常見用法,是用來宣告於外部實作的方法。

     
  • Partial
    允許將類別、結構或介面定義分割成多個檔案…。

    在相同 namespace 不同檔案繼續完成 class 內容,
  • readonly
    可以使用 readonly 修飾詞來宣告唯讀欄位。 只有在宣告或在同類別的建構式中,才能對 readonly 欄位進行指派。
  • unsafe
    表示任何與指標有關的作業都需要的不安全內容。

     
  • volatile
    指某個欄位可能是由同時執行的多個執行緒所修改。 宣告 volatile 的欄位並不適用編譯器最佳化,因為編最佳化是假設由單一執行緒進行存取保欄位中永遠是最新的值。

     

Leave a Reply