[C#]C#學習筆記-類型反射,晚期綁定,進程,對象上下文
C#學習筆記-類型反射,晚期綁定,進程,對象上下文
羅朝輝(http://www.rzrgm.cn/kesalin/)
《C#與.NET高級程序設計》讀書筆記
反射(Reflection)
1,程序集的元數據不僅可以描述一組內部類型,而且也可以描述任何一個被內部類型引用的外部類型。
2,反射是一個運行庫類型發現的過程,通過反射,我們可以通過編程得到與通過ildasm.exe顯示相同的元數據信息。反射定義在 System.Reflection命名空間中,而 System.Type 類定義了大量用來檢查一個類型的元數據的接口。
3,我們可以使用 System.Object.GetType(), System.Type.GetType()以及typeof()運算符來獲取 Type 引用。
晚期綁定,特性
4,晚期綁定是一種創建一個給定類型的實例并在運行時調用其成員,而不需要在編譯時知道它存在的一種技術。晚期綁定對程序的可擴展性非常重要。System.Activator 類是.NET晚期綁定過程中的關鍵所在,它僅僅定義了幾個成員方法,其中大多數與.NET遠程處理有關。
5,.NET平臺運行我們使用特性(attribute)把更多的元數據嵌入到程序集中。簡言之,特性就是用于類型,成員,程序集或模塊的代碼注解。.NET特性是擴展了抽象的 System.Attribute 基類的類類型,我們可以自該類派生出新類型來創建自定義特性。必須通過顯式的反射才能在代碼中使用特性。
進程,應用程序域和對象上下文
6,進程承載一組相關的.NET程序集,而應用程序域(AppDomain)是對該進程的邏輯細分。一個應用程序域進一步被細分成多個上下文邊界,這些邊界用來分組目的相似的.NET對象。使用上下文的概念,CLR便能夠確保恰當地控制那些帶特殊運行時要求的對象。
7,System.Diagnostics 命名空間定義了許多類型,它們允許我們以編程方式訪問進程和許多與診斷相關的類型,比如系統事務日志,性能計數器,進程相關等。
8,.NET平臺下,程序集并沒有直接承載在進程中,.NET可執行程序承載在進程的一個邏輯分區中,術語稱為應用程序域(AppDomain)。可見,一個進程可以包含多個應用程序域,每一個應用程序域承載一個.NET可執行程序。這與傳統的Win32進程相比,有如下好處:第一,應用程序域是.NET平臺操作系統獨立性的關鍵特性。這種邏輯分區將不同操作系統表現加載可執行程序的差異抽象化了。第二,和一個完整的進程相比,應用程序域的CPU和內存占用都要少得多。因此CLR加載和卸載應用程序域比起完整的進程來說也要快得多。第三,應用程序域為承載的應用程序提供了深度的隔離。如果進程中一個應用程序域失敗了,剩余的應用程序域也能保持支持。
9,單個進程可以承載多個應用程序域,其中每一個程序域都和該進程(或其他進程)中其他的程序域完全徹底地隔離開來。因此,如果不使用分布式編程協議(WCF),運行在某個應用程序域中的應用程序將無法訪問其他應用程序域中的任何數據(無論是全局變量和靜態字段)。操作系統進程只能承載默認的應用程序域,在進程啟動時,CLR將自動創建這個特定的應用程序域(默認的應用程序域),此后,CLR能夠根據需求創建其他的應用程序域。如果有需要(多數.NET工作并沒有這樣的需求),在運行時,可以使用System.AppDomain類的靜態方法在給定的進程中以編程方式創建應用程序域,該類也用于對應用程序域的低層次控制(比如加載或卸載應用程序域)。
10,應用程序域是承載.NET程序集的進程的邏輯分區,與此相似,應用程序域也可以進一步被劃分成多個上下文邊界(content boundary)。事實上,.NET上下文為單獨的應用程序域提供了一個方式,該方式能為一個給定對象建立一個“特定的家”。使用上下文,CLR可以確保在運行時有特殊需求的對象,可以通過攔截進出上下文的方法調用,得到適當的和一致的處理。這個攔截層運行CLR調整當前的方法調用,以滿足給定對象上下文的設定要求。比如,如果定義一個C#類需要自動線程安全(使用[Synchronization]特性),CLR將會在分配期間創建“上下文同步”。與進程定義默認的應用程序域一樣,每一個應用程序域都有一個默認的上下文。這個默認的上下文用于組合那些對上下文沒有具體的或唯一性需求的.NET對象。如果CLR判斷一個新創建的對象有特殊需求,一個新的上下文邊界將會在承載它的應用程序域中被創建。
11,不需要知道特定上下文的.NET對象稱為上下文靈活對象。這些對象可以從承載它的應用程序域的任何位置訪問,與對象的運行時需求沒有關系。而那些需要上下文分配的對象稱為上下文綁定對象,它們必須派生自 System.ContextBoundObject基類,這個基類表面該類對象只能在其被創建的那個上下文中正常運行。一個上下文敏感的類型可以使用特定種類的.NET特性修飾-上下文特性(派生自 System.Runtime.Remoting.Contexts.ContextAttribute基類)。
浙公網安備 33010602011771號