




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第1章 .NET 4.0體系結構微軟公司每隔幾年就會對其開發工具與平臺進行升級,使得開發人員能更高效、更快速地開發高可用性的應用程序。.NET Framework 4.0是最新的一個版本。該版本與.NET Framework的早期版本是可以同時存在的。本章將從體系結構方面講解.NET 4.0的新功能及其與.NET早期版本的不同之處,同時對于微軟新的Visual Studio 2010的使用方法進行詳細介紹。1.1 C#與.NET的關系C#是微軟公司為了支持.NET框架而研發的一門語言,它具有Java的簡潔、C+語言的靈活,并且有Pascal語言的嚴謹,是一門非常優秀的開發語言。.NET框架是一
2、個應用程序開發平臺,C#是為支持這個框架而開發的,它們具有非常密切的聯系。作為一個.NET開發者,學會使用C#語言是非常有必要的。C#與.NET之間的關系是非常密切的。C#只是一門語言,而且它是伴隨著.NET出現的語言,用C#語言編程時,需要使用.NET框架類庫來進行開發。但是與.NET框架相關的語言不止C#一種,開發人員可以使用Visual Basic.NET或者其他一些支持.NET的語言進行程序設計。1.1.1 .NET Framework 4.0簡介微軟公司自從發布.NET Framework 1.1以來,已歷經了4個版本。微軟不斷地改善原有版本的缺陷和不足,不斷地推出新的功能,到現在的
3、4.0版本,已經成為了一個功能強大的應用程序開發平臺,其發展路線如圖1.1所示。.NET Framework提供了一整套應用程序開發平臺,它實際上由一大堆技術組合而成,這些技術彼此協作,能為開發人員提供無限的可能。歸根結底,.NET Framework由如下幾大部分組成。q .NET語言:包括Visual Basic.NET、C#、JScript.NET、J#和C+等。q 通用語言運行時(CLR):提供所有.NET程序的執行引擎,并為這些應用程序提供自動化服務,比如安全性檢查、內存的管理和應用程序的優化等。q .NET框架類庫:包含大量內置的功能函數,使應用程序的開發人員可以更輕松地使用它提供
4、的功能來實現應用程序的開發。這些類庫被組織為幾個技術集,比如ASP.NET、Windows Forms、WPF、WCF、WF、Silverlight、網絡編程等。q Visual Studio:功能強大,使用簡便的集成化開發環境,具有一整套高效的功能集合和調試特性。圖1.1 .NET 版本發展路線圖在MSDN中,把整個.NET Framework分為兩大類:一類是通用語言運行時(CLR),另一類就是.NET Framework類庫。通用語言運行時是整個.NET應用程序的核心,無論使用什么樣的語言,編寫什么樣的.NET程序,都需要這個核心引擎所提供的核心功能。圖1.2是.NET Framewor
5、k的基本結構圖,該圖將.NET劃分為兩大部分,每一部分內部又細分了各種不同的功能模塊。在類庫部分,可以看到提供了很多開發人員常見的應用程序類型,基本上.NET程序員都在與.NET Framework中龐大的類庫打交道。通用類型系統為.NET應用程序提供了一個托管的平臺,它提供了較底層的功能,通常開發人員較少需要處理CLR的部分。圖1.2 .NET Framework基本結構微軟公司自從推出第一個.NET Framework以來,不斷地升級和精煉這套框架的可用性。到目前為止,已經發展到.NET 4.0版。這一版本的.NET Framework除了修正和提升了原有框架的不足之處以外,還增加了很多新
6、的開發類庫,比如WPF、WCF和WF這3套開發基礎庫。要深入理解.NET Framework這個大框架的架構,首先需要深入理解其核心部分,即CLR。1.2節將會詳細介紹。1.1.2 LINQ語言集成查詢在LINQ出現之前,當訪問數據源時,開發人員不得不掌握特定數據來源的數據訪問方法。比如要讀取和寫入XML數據,必須掌握操作XML的方法;要訪問數據庫,必須掌握ADO.NET技術等。語言集成查詢(Language Integrated Query,LINQ),如其名稱所暗示,在開發語言如C#或者是VB.NET中集成了數據查詢功能,這個功能的出現讓開發人員可以不用了解異構數據源的細節,便能使用一種統
7、一的方式來訪問數據源,使開發人員可以專注于業務邏輯的設計。圖1.3是LINQ的結構圖。從圖中可以看到,LINQ允許的數據源中,LINQ的可查詢能力可分作3大類:LINQ To Objects、LINQ To ADO.NET及LINQ To XML。下面對這3大類LINQ的組成部分進行簡要介紹。q LINQ To Objects:可以從任何實現了IEnumerable<T>接口的對象中查詢數據。q LINQ To ADO.NET:增強了LINQ To Objects,使之可以訪問關系型數據庫。從圖1.2中可以看到,其主要由3個部分組成:LINQ To SQL,用于查詢關系型數據庫,例
8、如SQL Server等;LINQ To Datasets,支持查詢DataSet或DataTable;LINQ To Entities,是Microsoft ORM解決方案,允許開發人員使用實體(Entities)聲明性的指定商業對象(business objects)的結構,并且使用LINQ進行查詢。q LINQ To XML(以前稱為XLinq),不僅包括LINQ To Objects的功能,還可以查詢和創建XML文檔。圖1.3 語言集成查詢LINQ結構例如,對于關系型數據庫來說,通常使用SQL語句來查詢數據庫。要查詢Northwind數據庫中employees表的Name字段,使用SQ
9、L語句語法如下所示。Select name from employees使用LINQ語法的話,語法與之類似,代碼如下所示。var query=form e in employeesselect 可以看到代碼與SQL語句非常相似,但是使用LINQ,讓開發人員可以用相同的語法查詢異構數據源。比如一個employees的對象的集合,或是來自Oracle數據庫的數據,都可以使用相同的語法進行查詢。1.1.3 WPF表現層技術簡介WPF是一種基于矢量繪圖引擎的用戶界面技術,也可以稱其為下一代的顯示系統。WPF可以讓具有創造力的設計人員設計具有震撼視覺體驗的Windows客戶端應用程序的用戶界
10、面,也可以使用其子集Silverlight創建具有創造力的Web Base應用。WPF有如下幾項重大的功能特色。q 基于矢量的繪圖技術:WPF基于DirectX,可以最大化地利用顯示卡的性能。基于矢量繪圖技術,可以無限地放大和縮小圖形。WPF利用Direct3D進行圖形著色,充分利用顯示卡的繪圖單元。q 采用聲明式的程序設計:使用派生自XML的XAML標記語言來聲明式的設計UI,設計人員也可以選擇微軟的Expression Blend設計軟件進行UI部分的可見即所得的設計。q Web樣式的布局模型:增強了流式布局模型的體驗,除了使用坐標進行布局外,還可以使用流動式布局排列用戶控件。q 強大的繪
11、圖功能的支持:除了支持基本圖形、文本塊外,還提供了很多繪圖特性,比如透明度及內置的3D支持。q 與多媒體、動畫技術的完美整合:設計人員可以使用XAML標記或借助于Expression Blend軟件來設計用戶界面動畫。q 樣式和模板:用于重用已有的樣式設定,使用模板可以改變元素的顯示方式,使用樣式可以為控件形成換膚效果。1.1.4 WCF通信層技術簡介WCF是一種統一的技術,是微軟基于SOA(Service Oriented Architecture,面向服務的架構)所推出的.NET平臺下的開發框架。WCF是微軟分布式應用程序開發的最新開發框架,它整合了.NET平臺下的分布式開發技術,比如.N
12、ET Remoting、Web Service和MSMQ等,使開發者可以創建一個跨平臺的、安全可信賴,以及事務性的解決方案。WCF具有如下3大基礎概念。q 消息和終結點:WCF建立在基于消息通信的基礎之上,可以用消息表示的任何內容,如HTTP請求和MSMQ消息都可以使用一種統一的編程模型來表示。這樣,可以在不同的傳輸方式中提供統一的API。消息在終結點之間傳送,終結點是發送或接收消息的場所,終結點定義消息交換所需要的所有信息。q 通信協議:元素的傳輸協議,在WCF中這是必需的。可以使用常用的傳輸協議如HTTP和TCP,可以通過局域網或互聯網來發送消息,也可以使用其他支持與MSMQ應用程序和對等
13、網上的節點進行通信的傳輸協議,而且使用WCF的可擴展特性可以添加更多的傳輸機制。通信堆棧中另一個必要的元素是消息格式的編碼,在WCF中,可以使用文本編碼、消息傳輸優化機制編碼及用于實現高效傳輸的二進制編碼。q 消息模式:WCF支持多種消息模式,不同的傳輸協議支持不同的消息模式,包括請求-回復模式、單向模式和雙工通信模式。關于更多WCF編程的細節知識,讀者可以參考MSDN上的WCF內容或專門介紹WCF的書籍。1.1.5 WF工作流基礎簡介WF是微軟在.NET 3.0之后推出的一套工作流開發框架。目的在于為現有的.NET應用程序嵌入工作流應用。WF不是一個獨立的工作流應用程序,它提供了一些類庫用于
14、輔助工作流應用程序的開發,并提供了實現工作流應用程序時所需要實現的一些機制,比如持久化、補償、跟蹤機制等。首先必須要明白,WF不是某一領域或通用領域的工作流應用程序,它是一種編程模型、一個工作流的引擎,主要目的是在Windows上快速啟用工作流的應用程序。使用WF可以處理的解決方案如下:q 可以為業務流程應用程序啟用工作流;q 用戶界面頁面流;q 文檔工作流系統;q 人工工作流;q 業務規則驅動的工作流;q 系統管理工作流。WF有以下幾個基本特點。q WF具有強大和靈活的工作流開發能力,使用Visual Studio提供的可視化設計工具和WF的運行時引擎,讓開發人員能夠以一種統一的方式開發應用
15、程序。q WF支持順序工作流、狀態機工作流和數據驅動工作流風格,并且支持工作流的持久化。這對于一些需要一天甚至一年之后再繼續的工作流來說非常有用。q WF支持使用特定領域模型解決問題,開發人員可以開發自己的活動組件,來引入對于特定領域問題的解決方法。q WF提供了完整的工作流開發系統,除了工作流運行時本身,微軟也提供了一套標準的活動、工作流持久化、工作流監控和追蹤、規則引擎、與VS緊密整合的工作流設計器,以及項目開發模板等。q 可以修改WF的默認行來擴展WF,比如可以提供自定義的持久化服務來取代WF提供的SQL持久化服務。q 對于企業來說,最重要的是WF包含在Visual Studio中,無須
16、花費額外成本。1.1.6 Windows CardSpace技術簡介隨著Internet的普及以及用戶對于網絡的依賴性的增強,越來越多的安全性問題也暴露出來,比如用戶的個人信息和賬戶的安全性問題。隨著網齡的增加,用戶必須記住越來越多的賬戶和密碼,以及許多網站重復使用相同的賬戶名和密碼。微軟在.NET 3.0中推出了CardSpace標識元系統的實現,使用戶能夠從標識公文包中選擇標識,并在接受這些標識的環境中使用這些標識。在安裝了.NET Framework 4.0之后,控制面板中會增加一個名為Windows CardSpace的選項,選擇該項之后,將會彈出一個編輯或查看卡片的窗口,用戶可以在該
17、窗口中輸入卡片,或導入一個托管卡片,如圖1.4所示。然后可以對應用程序進行編寫代碼,以便能夠從標識管理器中選出一種標識進行用戶的統一身份驗證。圖1.4 控制面板中的創建卡片對話框1.2 公共語言運行時公共語言運行時(Common Language Runtime,CLR)是一個和Java虛擬機一樣的運行時環境,主要負責資源的管理,比如內存分配和垃圾收集,以保證應用和底層操作系統之間的分離。簡而言之,.NET框架能保證用戶可以使用多種語言進行.NET應用程序的開發和交互,因為CLR實現了通用語言基礎架構(Common Language Infrastructure,CLI)。1.2.1 通用語言
18、基礎架構CLI通用語言基礎架構定義了構成.NET Framework基礎結構的可執行代碼,以及代碼運行時的環境規范。它定義了一個與語言無關的跨體系結構的運行環境,這使得開發者可以用規范內定義的各種高級語言來開發軟件,并且無須修正即可將軟件運行在不同的計算機體系結構上。%注意:CLI與CLR不要混用,CLI是一種規范,而CLR是這種規范的一種實現。CLI是一個開發型的技術規范,由微軟、惠普和英特爾于2000年向ECMA倡議的,在CLI中包含以下幾個重要的部分。q 通用類型系統(CTS):規范.NET中數據的類型。q 元數據系統(Metadata):是.NET中描述數據的數據。q 通用語言規范(C
19、LS):描述多語言之間進行交互的語言規范,.NET系統包括的語言有C#、C+、VB、J#,它們都遵守通用語言規范。q 虛擬執行系統(VES):是一個可運行受管理代碼(Managed Code)的運行環境,它提供了運行受管理代碼所需要的內置數據類型(data type),以及假定的機器型態與狀態設置、流程控制與例外處理等參數。整個CLI的架構如圖1.5所示。圖1.5 CLI架構.NET的系統結構是非常龐大和復雜的,要想全面了解,需要學習大量的知識。讀者可以參考MSDN中的介紹。1.2.2 CLR的作用有了公共語言運行時,開發人員就可以很容易地設計出對象能夠跨語言交互的組件和應用程序。也就是說,用
20、不同語言編寫的對象可以互相通信,并且它們的行為可以緊密 集成。例如,可以定義一個類,然后使用不同的語言從原始類派生出另一個類或調用原始類的方法。還可以將一個類的實例傳遞到用不同的語言編寫的另一個類的方法。這種跨語言集成之所以成為可能,是因為基于公共語言運行庫的語言編譯器和工具使用由公共語言運行庫定義的通用類型系統,而且它們遵循公共語言運行庫關于定義新類型,以及創建、使用、保持和綁定到類型的規則。相對于過去的一些開發平臺(比如Delphi),.NET CLR有如下優點:q 跨語言集成,特別是跨語言繼承,使得用VB.NET寫的類能輕松的被C#類繼承。q 垃圾回收,它管理對象生存期,使引用計數變得不
21、再必要,程序員無須關心類的釋放問題,一切都由CLR的垃圾回收器在后臺回收。q 自我描述的對象,它使得使用接口定義語言(IDL)不再是必要的,使用.NET反射可以很輕松地獲取到運行時類型信息。q 編譯一次即可在任何支持公共語言運行時的CPU和操作系統上運行的能力。1.3節將深入到語言層次,對C#語言的新特性進行講解。1.3 C# 4.0的新增特性回顧C#語言的發展,從1.0到現在的4.0,每一個版本都會增加一些激動人心的特性。比如2.0加入了對泛型的支持,3.0新增了一些語法特性以支持LINQ等開發框架,在C# 4.0中增加了動態語言等特性。要全面理解C#語言,需要全面掌握這些已有的功能和新增特
22、性,這樣才能最大限度地發揮C#語言的功能。1.3.1 C# 4.0面向對象編程簡介C#是一門純面向對象的語言。在C#語言中連基本的數據類型都是派生于System.object的類型,比如int、double等。與使用Java語言一樣,應該具有萬事萬物皆對象的理念來使用C#進行程序設計,這需要讀者具有良好的面向對象編程的思想。編程是一個非常抽象的工作,需要將現實世界中的實體轉化為電腦軟件。面向對象的思想要求用戶具有對現實世界中的事物進行抽象的能力。比如在開發一個生產管理軟件時,所有與生產管理相關對象,包含工人、產品、生產單、異常等,都是一個個的對象。那么在編寫C#代碼時,應該仔細考慮這些現實世界
23、中的對象,然后進行分析和對象化。對象具有屬性和方法,以及與這些屬性和方法相關聯的一系列的事件。比如生產管理軟件中,如果工人是一個對象的話,那么年齡、性別就是工人這個對象的屬性;可以將工人工作這個行為當作是工人這個對象的方法;到了下班的時間工人要下班,可以將在這個時間觸發的行為稱之為事件。下面的示例將使用微軟公司最新的Visual Studio 2010創建一個C#控制臺應用程序,演示如何使用C#創建一個類,并添加屬性和方法。步驟如下:(1)打開Visual Studio 2010,選擇“文件”“新建”“項目”命令,從彈出的窗口中選擇Visual C#|Windows |“控制臺應用程序”命令,
24、如圖1.6所示。在名稱窗口中輸入應用程序的名稱為ClassDemo,指定文件所要保存的路徑,單擊“確定”按鈕,Visual Studio將自動創建一個控制臺應用程序項目,并且進入到代碼錄入窗口。圖1.6 新建控制臺應用程序(2)在代碼輸入窗口中編寫一個名為Worker的類,表示一個生產管理系統中的工人,他具有姓名、性別、年齡屬性和一個名為Working()的方法,如代碼1.1所示。代碼1.1 Worker類定義代碼/ <summary>/ 生產管理系統中的工人類/ </summary>public class Worker public event EventHandl
25、er <EventArgs> OffWork; /下班事件 public string Name get; set; /姓名 public int Age get; set; /年齡 public bool IsBoy get; set; /是否男生 public void Working() /正在工作的方法 Console.WriteLine("姓名:0,性別1,年齡2 正在工作中.",Name,IsBoy,Age); if (DateTime.Now.Hour = 14) /如果是下午2點,則提示已下班 if (OffWork != null) /要判斷該
26、事件是否被賦值 OffWork(this, new EventArgs(); /調用下班事件處理代碼 在上面的代碼中,使用了C# 3.0以來的屬性簡化語法來定義了3個屬性,使用泛型的EventHandler定義了一個事件句柄。Working事件中首先在控制臺窗口中打印一行Worker類當前的屬性信息,然后在當前時間為14時觸發OffWork事件,如果當前時間是下午2點時,將觸發用戶定義的一段事件處理代碼。(3)在控制臺的主應用程序中編寫代碼實例化這個Worker類,然后設置這個Work類的屬性,并調用Worker類的方法,如代碼1.2所示。代碼1.2 實例化Worker類代碼class Pro
27、gram static void Main(string args) Worker worker = new Worker(); /實例化一個Worker類 worker.Name = "一個工人" /設置姓名屬性 worker.Age = 18; /設置年齡屬性 worker.IsBoy = true; /設置性別屬性 worker.OffWork += /關聯一個下班的事件處理代碼 new EventHandler<EventArgs>(worker_OffWork); worker.Working(); /調用類的方法 Console.ReadLine()
28、; /暫停屏幕關閉 /員工下班的事件處理代碼 static void worker_OffWork(object sender, EventArgs e) Console.WriteLine("該員工到點已下班了!"); 代碼1.2使用new語法創建了一個生產工人,然后指定工人的姓名、性別和年齡,為工人下班事件關聯了一個名為worker_OffWork()的方法,最后調用Working類方法開啟員工工作。程序運行效果如圖1.7所示。在將當前系統時間調到下午2點多以后,控制面板窗口中會顯示出該員工已經下班的信息。圖1.7 對象示例運行效果本節只能對C#面向對象的知識進行簡單介
29、紹,完整介紹面向對象的理論和C#進行面向對象的編程需要很多篇幅,讀者可以參考一些專門介紹面向對象的書籍。1.3.2 強數據類型強數據類型是指必須為變量指定一個數據類型,C#本身是一門類型安全的編程語言,類型訪問必須根據所指定的數據類型來訪問,比如將一個字符串類型當作一個整數類型來訪問是不被允許的。C#本身支持靜態類型檢查,因此在編譯時強制類型安全,.NET的通用語言運行時將強制執行動態類型安全檢查,以便在程序運行前就能消除類型轉換的錯誤。Visual Studio的智能提示功能,可以通過靜態類型檢查發現錯誤的類型操作。如圖1.8所示,當為一個整型賦一個字符串時會提示類型不能正確轉換。由于C#的
30、類型規則非常的嚴格,即使將一個浮點數傳遞給一個接受整型的函數,如果不進行強制類型的轉換,也將會出現錯誤。使用強類型的這種特性,可以使C#代碼運行在一個安全的、受控的環境中不至于被其他方面破壞。圖1.8 Visual Studio 2010類型檢查提示1.3.3 動態類型綁定動態綁定是C# 4.0中非常重大的創新,它的出現類似于在C# 2.0中的泛型一樣。動態綁定的靈感來源于一些如Python、Ruby、JavaScript和Smalltalk等動態語言。動態綁定的定義是:將解析類型和成員的過程由編譯時延遲到運行時。C#是一種強數據類型的語言,因此在編譯時已經決定了其數據類型,即便是使用Var關
31、鍵字的隱式類型聲明,在編譯時仍然會變成確切的類型。而動態綁定聲明是指在編譯時并不知道它引用對象的確切類型,在運行時才知道。下面新建一個控制臺應用程序名為DynamicBindingDemo,編寫動態綁定的代碼見代碼1.3。代碼1.3 動態綁定示例代碼class Program static void Main(string args) dynamic obj = new DynTypeObject();/定義動態對象 obj.Working(); /調用動態方法 obj.WorkingOthers(); Console.ReadLine(); /暫停控制臺屏幕 public class Dyn
32、TypeObject : DynamicObject/創建一個動態綁定對象 /重載調用成員方法 public override bool TryInvokeMember(InvokeMemberBinder binder, object args, out object result) Console.WriteLine(binder.Name + "方法正在調用");/在控制臺顯示信息 result = null; return true; /返回布爾值 在上面的代碼中,DynTypeObject對象是一個動態綁定的對象。可以看到,Working()和WorkingOth
33、ers()實際上并沒有進行定義,但是在運行時可以看到這兩個方法被成功調用,如圖1.9所示。圖1.9 動態方法調用以傳統的眼光來看,DynTypeObject是一個派生自DynamicObject的普通的類。它并沒有定義Working和WorkingOthers方法。如果不是派生自DynamicObject,運行這段代碼將會產生異常。這是因為.NET是強數據類型的,而DynamicObject使得調用在運行時動態的產生,因此輸出了如圖1.9所示的結果。1.3.4 泛型類型的協變(covariant)和逆變(contravariant)在.NET 4.0之前的版本中,泛型類型是不支持協變和逆變的,
34、但是委托類型的參數是支持協變和逆變的。什么是協變和逆變呢?在編程語言中,“協變”是指能夠使用與原始指定的派生類型相比派生程度更大的類型;“逆變”則是指能夠使用派生程度更小的類型。下面的代碼很好地演示了委托類型的協變。假定有一個類Animals,從其派生出一個子類Dogs,那么當定義一個委托,該委托返回Animals。用戶也可以將一個返回Dogs的委托賦值給該委托,稱之為協變,見代碼1.4。代碼1.4 委托的協變class Program public delegate Animals HandlerMethod();/返回Animals的委托 public static Animals Fir
35、stHandler() /返回Animals的方法實現 Console.WriteLine("返回Animals的委托"); return null; public static Dogs Secondhandler() /返回Dogs的方法實現 Console.WriteLine("返回Dogs的委托"); return null; static void Main(string args) HandlerMethod handler1 = FirstHandler; /標準委托 HandlerMethod handler2 = Secondhandl
36、er;/委托協變 / 定義一個Animals的類 public class Animals public string Location get; set; / 定義一個派生自Animals的Dogs類 public class Dogs : Animals public string Cry get; set; 在上面的代碼中,首先定義了Animals類和Dogs類,然后定義了一個名為HandlerMethod的委托,該委托返回Animals類型的值。在Main()方法中,分別賦給一個返回Animals類型的值和一個返回Dogs類型值的方法。可以看到,由于委托的協變特性,使得本來返回一個An
37、imals的委托可以接受一個返回Dogs的委托。.NET 4.0引入了in/out參數,使泛型類型的協變和逆變得以實現。比如定義一個泛型接口或者是泛型委托,可以使用out關鍵字,將泛型類型參數聲明為協變。協變類型必須滿足條件:類型僅用作接口方法的返回類型,不用作方法參數的類型。可以使用in關鍵字,將泛型類型參數聲明為逆變。逆變類型只能用作方法參數的類型,不能用作接口方法的返回類型。逆變類型還可用于泛型約束。下面的示例演示了如何使用in/out參數來設置泛型類型的協變和逆變。協變的使用見代碼1.5。代碼1.5 泛型的協變interface ITest<out T> /定義一個支持協變
38、的接口 T X get; /屬性 T M(); /返回T類型的方法/定義一個實現接口的泛型類class TestClass<T> : ITest<T> where T : Base, new()/約束T要派生自Base,具有構造函數 public T X get; set; /實現泛型方法 public T M() return new T(); /定義兩個類class Base class Derived : Base class Program static void Main(string args) ITest<Derived> _derived =
39、 new TestClass<Derived> X = new Derived() ;/使用對象初始化語法賦初值 ITest<Base> _base = _derived; /泛型協變 Base x = _base.X; Base m = _base.M(); 在上面的代碼中,定義了一個泛型接口ITest,注意使用了out參數以支持協變。然后TestClass泛型類實現了接口,并且定義了泛型約束指定T類型必須是派生自Base類的子類。可以看到在Main主窗體中,定義了一個ITest的接口,然后利用泛型的協變特性來進行泛型類型之間的變換。與協變相反的是,逆變是將基類轉換為
40、派生類,泛型逆變有如下兩條規則:q 泛型參數受in關鍵字約束,只能用于屬性設置或委托(方法)參數。q 隱式轉換目標的泛型參數類型必須是當前類型的“繼承類”。例如,代碼1.6定義了一個接口,演示了哪些是允許協變,哪些是允許逆變的。代碼1.6 接口的逆變interface ITest<in T> T X get; /獲取屬性不允許逆變 set; /設置屬性允許逆變! T M(T o); /只允許方法參數,不能作用于方法返回值與協變相反,逆變符合多態性的規律,逆變有些令人費解,不過逆變主要是為泛型委托準備的。逆變的使用如代碼1.7所示。代碼1.7 委托的逆變class Program s
41、tatic void Main(string args) Action<Base> _base = (o) => Console.WriteLine(o);/定義一個Base基類 Action<Derived> _derived = _base;/使用協變將基類轉換為派生類 _derived(new Derived();/逆變的效果 以上代碼中創建了一個委托,是基于Base類,但是在后面的賦值語句中,將基類賦給派生類,形成了逆變。1.3.5 命名參數和可選參數C# 4.0新增的功能在MSDN中有詳細介紹,本書不再一一介紹。本節將介紹命名參數和可選參數。q 命名參數
42、允許一個函數調用者通過名稱,而不是參數所在的位置來標識一個參數。q 可選參數允許函數指定一個默認值,這樣調用方在調用時可以省略默認值。命名參數語法示例如代碼1.8所示。代碼1.8 委托的逆變class Program static void Main(string args) NamedParameters(P1: "命名1", P2: "命名2", P3: "命名3"); /使用命名參數語法 static void NamedParameters(string P1,string P2,string P3)/自定義函數 Consol
43、e.WriteLine("參數1:0,參數11,參數22", P1, P2, P3); 可以看到,命名參數命名的方式指定參數,不用關注參數的位置,而且Visual Studio 2010還提供了參數提示功能。可選參數的示例如代碼1.9所示。代碼1.9 委托的逆變/定義一個帶有可選參數的參數,指定默認值static void ShowText(string text = "這是默認的文本") Console.WriteLine(text); static void Main(string args) ShowText(); /調用時不傳遞參數,將使用默認參
44、數 Console.Read();可以看到,在定義函數時指定了參數的默認值,在調用時可以不指定參數,將會使用默認的參數進行代替。本節介紹了一些C# 4.0新增的特性。當然C#新增的功能還有很多,有興趣的讀者可以參考MSDN中的內容。下面一節將討論如何使用全新的Visual Studio 2010集成化開發環境。1.4 使用Visual Studio 2010集成化開發環境Visual Studio 2010是微軟公司集成化開發環境的最新版本,微軟一共發布了如下4個版本的Visual Studio 2010。q 2010 Professional 專業版:適用于個人執行基本開發任務。q 2010 Premium 企業版:適用于個人和團隊開發可擴展的高質量的應用程序。q 2010 Ultimate 旗艦版:ALM 工具適用于團隊,可確保從設計到部署均獲得高質量成果。q Test Professio
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何看待來自網絡的政治動員現象試題及答案
- 軟件設計師考試準備技巧試題及答案
- 2024年福建南平水務集團有限公司招聘臺青筆試真題
- 非營利組織在政策中的角色試題及答案
- 農業科技成果轉化與新型農業經營主體創新發展路徑研究
- 軟件設計師考試高頻考點試題及答案
- 2025年高校產學研合作技術轉移與成果轉化中的企業參與機制研究
- 硬件與網絡搭建相關試題及答案
- 公共政策對社會發展的影響試題及答案
- 軟件設計師清晰思路訓練試題及答案
- 個人商業計劃書范文5篇
- 2025年反恐與公共安全管理職業資格考試試卷及答案
- 2025高考語文押題作文10篇
- 福建卷-2025屆高考化學全真模擬卷
- 2022隧道順光照明技術指南
- 2025年廣東省廣州市增城區中考一模化學試題(含答案)
- 2025高考英語作文考前背誦(應用文+讀后續寫)
- 河北開放大學2025年《西方行政制度》形成性考核3答案
- 人教版九年級語文中考真題匯編 《水滸傳》(2022-2024)全國中考語文真題
- 2025年鐵路列車員(初級)職業技能鑒定參考試題庫(含答案)
- 2024春形勢與政策-鑄牢中華民族共同體意識課件
評論
0/150
提交評論