程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> Microsoft .Net & C#

Microsoft .Net & C#

編輯:C#入門知識
  Topic 1:
  
  C#是MS根據他的.Net戰略提出的一種新語言。根據微軟的技術資料,他是一種c/c++語言的擴展和升級。那麼他除了繼承了c/c++的簡潔優美的的語言之外
  
  他還具有那些新特性呢?
  
  交叉語言集成:我們知道com最大的優點就是實現了軟件模塊的功能和開發語言之間的獨立性。那麼在.Net系統中依然沿襲了com的這個優點
  
  自動內存管理:在c#出現之前Java是唯一一個實現了自動內存管理的語 言,使java成為一種健壯的語言,但是由於自動內存管理,java也犧牲了很大一部分系統性能和編程的靈活性。C#借鑒了java的成功經驗,而且在提高系統性能和編程靈活性上有著獨到之處
  
  交叉語言異常處理:在com中組件的出錯處理是拋出令人迷惑的hresult和ole error.在.NET中這種出錯處理將有跨語言的異常處理來解決。
  
  版本支持:取消了dll的版本混亂問題。
  
  組件交互的簡化模式:在com中vc,的調用com是比較繁瑣的但是在vb中卻異常簡單。因此在.net中讓c# ,c/c++,pascal等調用組件的方式統一化,簡單化
  
  Topic 2:
  
  C#具有如此多的功能,那麼他們是如何實現的呢?這個問題回答有賴於對Microsoft.Net Runtimes 技術:
  
  微軟中間語言(Microsoft Intermediate Language, ab: MSIL):
  
  這是一種微軟定義的一種界於源代碼和機器碼之間的中間語言,並有特定的語言(如c# compiler:csc,vc complier:cl等)的編譯器將其包裝成exe格式的偽代碼(p代碼)。他和java的byte code無論在工作方式上還是框架結構上都有很大的不同。在這裡你只需要記住:MSIL不是一種執行代碼而是一種語言(你可以想象成是.NET平台上的asm匯編語言)
  
  元數據(Metadata):
  
  盡管IL代碼由編譯器產生,但它並不是編譯器提供給運行時僅有的東西。編譯器同樣產生有關你代碼的元數據,它告訴運行時有關你代碼的更多的東西,例如各種類型的定義、各種類型成員的簽名以及其它數據。基本上,元數據是類型庫、注冊表內容和其它用於COM的信息。盡管如此,元數據還是直接和執行代碼合並在一起,並不處在隔離的位置。
  IL和元數據存放於擴展了PE格式的文件中(PE格式用於.exe和.dll文件)。當這樣的一個PE文件被裝載時,運行時從文件中定位和分離出元數據和IL。
  3.即時編譯器(Just �in-time compliers ,簡稱J99vers)
  
  c#和java的確很相像,但是他們之間最大的不同是java采用解釋執行,而c#采用編譯。但是c#的編譯和c的編譯又完全不同,他是一種jit編譯(java也有,但是他們工作方式不同後面將會詳細展開).
  
   
  
  Topic 3
  
  由C#編譯器生成的受管代碼並不是原始代碼,但它是中間語言(IL)代碼。這種IL代碼自身變成了NGWS runtime的受管執行進程的入口。IL代碼明顯的優勢在於它是CPU無關的,這也意味著,你要用目標機器上的一個編譯器才能把IL代碼轉換成原始代碼。
  
  在進一步說明之前,我想給你已有的IL指令的簡短目錄。盡管不需要你熟記和理解,但是它列出了你所必需的、C#程序所基於的知識基礎這指明了MSIL將負責那些具體的事情。
  算術和邏輯操作符
  控制流
  直接內存訪問
  堆棧操作
  參數和局部變量
  堆棧分配
  對象模式
  實例類型值
  臨界區
  數組
  分型位置
  即時編譯器(J99vters)
  
  Topic4:
  雖然IL代碼被包裝在一個有效的PE文件中,但是你還是不能執行它,除非它被轉換成為受管原始代碼。這就是NGWS runtime 即時編譯器(也稱作J99vters)大顯身手的時候。
  
  為什麼不把整個IL PE文件編譯成原始代碼? 答案是時間--需要把IL代碼編譯成CPU規格的代碼的時間。這種編譯將更加有效率,因為一些程序段從來就沒有被執行過。例如,在我的字處理器中,郵件合並功能從來就沒有被編譯。
  MSIL和J99vER讓我們聯想起了Java的byte code, jvm和jit。他們是如此的相像,但是我要告訴你的是這兩者並不是如我們所想的那樣相似反而他們有著天差地別的不同。
  
  首先剛才我們說過MSIL可以理解為.net上的匯編語言。
  
  這是因MSIL 不是一種可執行碼仍然是一種某種形式的語言不過是編譯的時候加上了metadata包裝成了二進制流的格式,我們可以通過ms的ildasm反編譯器查看到這種類似於匯編語言的中間碼。而java的bytecode,從某種意義下它已經是一種可執行碼了(不過不是cpu執行而是jvm執行).
  
  C# 的J99vER和 java的 jvm jit工作方式不同。
  
  首先我們看一下.net的運行庫和java的代碼庫的不同。在java中所有的系統庫都以bytecode形式存放,然後由jvm解釋程序中所有的需要用到得庫代碼然後調用本地系統的接口完成相應的操作。
  
  而.net的通用運行庫(CLR)是100%本地代碼。.net系統是一個
  
  充滿了CLR的dll的大容器。當jit載入MISL時,MISL並不指
  
  揮.net系統去調用本地的系統接口。而是指定.net系統去編譯連接
  
  那些需要的clr的dll。編譯出來的是100%native code。從技術上
  
  說,全部的處理過程如下:當一個類型被裝載時,裝載器創建一個存
  
  根(stub),並使它連接每一個類型的方法。當一個方法第一次被調用
  
  時,存根把控制交給J99v。J99v把IL編譯為原始代碼,且把存根指針
 

[1] [2] [3] [4] 下一頁  


  指向緩沖了的原始代碼。接著的調用將執行原始碼。在某些位置上
  
  (At some point),所有的IL都被轉換成為原始代碼,而J99vter處
  
  於空閒狀態。可以說c#是結合了c/c++編譯和java的中間代碼的
  
  自的優點,又屏蔽了各自的缺點c/c++不獨立平台,以及java的低
  
  效率
  
  C代碼的編譯過程 Java代碼解釋過程 c# J99v過程
  
  
  
  
  
  
   
  
  Java自己也有J99v,但是它的jit是不徹底的。他人仍然不是100%的
  
  native code,仍然需要jvm的解釋執行。因此java的性能一直沒有辦法
  
  提高。
  
  C#的方法是編譯但是又不同於c的編譯,他將編譯分為幾個階段來進行。
  
  匯編代碼的編譯肯定比源代碼來的快,jit的局部代碼編譯肯定比全部程
  
  序編譯來的快,因此使用c#編程性能上的損失比java少的多,當然和c
  
  比起來還是有一點延遲特別是代碼啟動的時候,但是比java好得多了。
  
  Topic 5:
  
  1 虛擬對象系統(VOS)
  到目前為止,你僅看到了NGWS runtime如何工作,但是並不了解它工作的技術背景以及為什麼它要這樣工作。這節都是關於 NGWS 虛擬對象系統的(VOS)。
  以下為在VOS中形成聲明、使用和管理類型模型時,NGWS runtime的規則。在VOS背後的思想是建立一個框架,在執行代碼時不能犧牲性能,允許交叉語言集成和類型安全。
  我提到的框架是運行時架構的基礎。為了幫助你更好地了解它,我將它勾出四個區域。當開發C#應用程序和組件時,理解它們很重要。
  1.1VOS類型系統--提供豐富的類型系統,它打算支持全面編程語言的完全實施。
  1.2元數據--描述和引用VOS類型系統所定義的類型。元數據的永久格式與編程語言無關,但是,元數據拿自己當作一種互換機制(nterchange mechanism)來使用,這種互換是在在工具和NGWS的虛擬執行系統之間。
  1.3通用語言規范(CLS)--CLS定義了VOS中類型的子集,也定義了常規的用法。如果一個類庫遵守CLS的規則,它確保類庫可以在其它所有能實現CLS的編程語言上使用。
  1.4虛擬執行系統(VES)--這是VOS實時的實現。VES負責裝入和執行為NGWS運得時編寫的程序。
  這四個部分一起組成了NGWS runtime架構。每一部分在下面小節中描述。
  
  1.1 VOS類型系統
  VOS類型系統提供豐富的類型系統,它打算支持多種編程語言的完全實施。所以,VOS必須都支持面向對象的語言和過程編程語言。
  現在,存在著很多種近似但有點不兼容的類型。就拿整型當例子,在VB中,它是16位長,而在C++中,它是32位。還有更多的例子,特別是用在日期和時間以及數據庫方面的數據類型。這種不兼容使應用程序的創建和維護不必要地復雜化,尤其當程序使用了多種編程語言時。
  另一個問題是,因為編程語言之間存在著一些差別,你不能在一種語言中重用另一種語言創建的類型。(COM用二進制標准接口部分地解決了這個問題)。 當今代碼重用肯定是有限的。
  發布應用程序的最大障礙是各種編程語言的對象模型不統一。幾乎每一方面都存在著差異:事件、屬性、永久保存(persistence)等等。
  VOS這裡將改變 這種現象。VOS定義了描述值的類型,並規定了類型的所有值所必須支持的一條合約。由於前面提到的支持面向對象和過程編程語言,就存在著兩種值和對象。
  
  對於值,類型存儲於表述(representation)中,同樣操作也在其中實行。對象更強大因為它顯式地存於表述中。每一個對象都有一個區別於其它對象的識別號。
  1.2元數據
  盡管元數據用於描述和引用由VOS類型系統定義的類型,但它還不能鎖定到這個單個目標。當你寫一個程序時,通過利用類型聲明,你所聲明的類型(假定它們是數值類型或引用類型)被告知給NGWS runtime類型系統。類型聲明存在於PE可執行文件內部的元數據中得到描述。
  基本上,元數據用於各項任務:用於表示NGWS runtime用途的信息,如定位和裝載類、 內存中這些類的事例、解決調用 、翻譯IL為原始碼、加強安全並設置運行時上下文邊界。
  你不必關心元數據的生成。元數據是由C#的"代碼轉IL編譯器"(code-to-IL compiler,不是J99v編譯器)生成的。代碼轉IL編譯器發送二進制元數據信息給PE文件,是以標准的方式發送的,不象C++編譯器那樣,為出口函數創建它們自己的修飾名字。
  你從元數據和可執行代碼並存所獲得的主要優勢為,有關類型的信息同類型自身固定在一起,不會遍布很多地方。同樣有助於解決存在於COM中的版本問題。進一步地,你可以在相同的上下文中使用不同的版本庫,因為庫不僅被注冊表引用,也被包含在可執行代碼中的元數據引用。
  
  
  1.3通用語言規范
  通用語言規范(CLS)並不是虛擬對象系統(VOS)真正的一部分,它是特殊的。CLS定義了VOS中的一個類型子集,也定義了必須符合CLS的常規用法。
  那麼,對此有什麼迷惑呢?如果一個類庫遵守CLS規則,其它編程語言同樣也遵守CLS規則,那麼其它編程語言的客戶也可以使用類庫。CLS是關於語言的交互可操作性(interoperability)。因此,常規用法必須僅遵循外部可訪問項目 (externally visible items)如方法、屬性和事件等等。
  我所描述的優點是你可以做以下工作。用C#寫一個組件,在VB中派生它,因加在VB中的功能是如此之強大,在C#中再次從VB類派生它。只要所有的外部可訪問項遵守CLS規則,這樣是可行的。
  構建你的類庫時要注意到CLS協定。我提供了表2.1,用以給類型和外部可訪問項定義協定規則。
  這個清單不完整。它僅包含一些很重要的項目。我不指出出現在本書中每一種類型的CLS協定,所以有個好主意:當你尋找CLS協定時,至少應該用浏覽該表,以了解哪種功能有效。不要擔心你不熟悉這章表中的每一個含義,在這本書中你會學到它們。
  
  表2.1 通能語言規范中的類型和功能
  
  bool
  char
  byte

上一頁  [1] [2] [3] [4] 下一頁  


  short
  int
  long
  float
  double
  string
  object(所有對象之母)
  
  Arrays(數組)
  數組的維數必須是已知的(>=1),而且最小下標數必須為0。
  要素類型必須是一個CLS類型。
  
  類型(Types)
  可以被抽象或隱藏。
  零或更多的接口可以被實現。不同的接口允許擁有具有相同名字和簽名的方法。
  一個類型可以准確地從一個類型派生。允許成員被覆蓋和被隱藏。
  可以有零或更多的成員,它們是字段(fields)、方法、事件或者類型。
  類型可以擁有零或更多個構造函數。
  一種類型的可訪問性可以是公共的或者對NGWS組件來說是局部的;但是,僅公共成員可以認為是類型接口的一部分。
  所有的值型必須從系統值型繼承。異常是一個枚舉--它必須從系統枚舉(System Enum)繼承。
  
  類型成員
  類型成員允許隱藏或者覆蓋另一種類型中的其它成員。
  參數和返回值的類型都必須是 CLS 協定 類型。
  構造函數、方法和屬性可以被重載。
  一個類型可以有抽象成員,但僅當類型不被封裝時。
  
  方法
  一種方法可以是靜態、虛擬或者實例。
  虛擬和實例方法可以是抽象的,或者是一個實現。靜態方法必須總擁有一個實現。
  虛擬方法可能是最後的(或者不是)。
  
  字段(Fields)
  可以是靜態或者是非靜態。
  靜態字段可以被描述或只初始化。
  
  屬性
  當獲取和設置方法而不是使用屬性語法時,屬性可以公開。
  獲取的返回類型和設置方法的第一個參數必須是相同的CLS類型--屬性的類型。
  屬性名字必須不同,不同的屬性類型用於區分是不充分的。
  由於使用方法實現屬性訪問,如果 PropertyName 是同一個類中定義的一個屬性,你不能實現命名為 get_PropertyName 和 set_PropertyName 的方法。
  屬性可以被索引。
  屬性訪問必須遵循這種命名格式:get_ProName,set_PropName。
  
  枚舉(Enumerations)
  強調類型必須是byte、short、int 或long。
  每一個成員是一個枚舉類型的靜態描述字段。
  一個枚舉不能實現任何接口。
  你允許給多字段設定相同的值。
  一個枚舉必須繼承系統枚舉(隱含在C#中)
  
  異常
  可以被引發和被捕獲。
  自定義異常必須繼承系統異常。
  
  接口
  可需要實現其它接口。
  一個接口可以定義屬性、事件和虛擬方法。實現取決於派生類。
  
  事件
  增加和取消方法必須是都提供或者都沒有 ,每一種方法采用一個參數,它是一個從系統代表元(System Delegate)派生下來的類。
  
  自定義屬性
  可以僅使用下更類型:Type(類型),char, char, bool, byte, short, int, long, float, double, enum (一種CLS 類型), and object.
  
  代表元(Delegates)
  可以被創建和被激活
  
  標識符(Identifiers)
  一個標識符的第一個字母必須來自一限制集。
  通過大小寫在單一范圍內,不可能唯一地區別兩個或更多個標識符(大小寫不敏感)。
  
  1.4虛擬執行系統(VES)

  虛擬執行系統實現了虛擬對象系統。通過實現一個負責NGWS runtime的執行引擎(execution engine,縮寫EE)創建VES。這個執行引擎執行你用C#編寫和編譯的應用程序。
  下列組件為VES的一部分。
  1、中間語言(IL)--被設計為很容易受各種各樣的編譯器所兼容 。在該框架之外,C++、VB和C#編譯器都能夠生成IL。
  2、裝入受管代碼--這包括解決內存中的名字、 表層類(laying out classes ),並且創建J99v編譯所必需的存根。通過執行經常性校驗,包括加強一些訪問規則,類裝載器同樣也增強了安全性。
  3、用J99v轉換IL成原始代碼--IL代碼並不是設計成為一種傳統的解釋字節代碼或樹型代碼,IL轉換是真正的編譯。
  4、裝入元數據、校驗類型安全和方法的完整性
  5、垃圾收集(GC)和異常處理--兩者都是基於堆棧格式的服務。受管代碼允許你動態地跟蹤堆棧。要動態地識別各個堆棧框架,J99vter或其它編譯器必須提供一個代碼管理器。
  6、描繪和查錯服務--兩者都取決於由源語言編譯器所生成的信息。必須發出兩個映射:一個映射從源語言結構發到指令流中的地址,一個映射從地址發到堆棧框架中的位置。當執行從IL到原始代碼的轉換時,這些映射被重新計算。
  7、管理線程和上下文,還有遠程管理--VES為受管代碼提供這些服務。
  雖然這個清單並不完整,但它足以讓你理解運行時基於的由VES提供的低層架構。
  
  Topic6:Microsoft.Net與Java
  
  .Net和Java都是為了asp而設計的方案,都希望在Internet時代的asp上占有一席之地。孰優孰劣,現在還很難說.
  
  MS的CEO Ballmer接受電視采訪中這樣說過“我們相信xml所以設計了.Net,而他們(指sun)相信Java”
  
  sun的ceo maclline在java發布的時候這樣描述過java”你在你的網絡計算機面前,你在文字處理軟件上點選一下,就現在一個只有四個基本功能的文字處理軟件。他們用心髒跳動以下

上一頁  [1] [2] [3] [4] 下一頁  

的時間就穿過了來了,因為程序碼很短。他又四個功能;刪除,恢復,剪貼,打印。如果我需要文字向右對齊,我就可以下載額外的功能。如果我需要拼子檢查我可以下載他。這就是一個子集:一種面向對象的,規模可調節的,結實的,可伸縮的環境”
  
  客戶端的小型化,應用服務化是未來的趨勢,但是ms和sun的方式是如此的不同。
  
  Sun希望提供的是一個隨處都可插拔的”軟CPU”即jvm,跨平台,健壯性,是它的精華。Java在嵌入式技術上的前景不錯,Sun已經在手機中值入他們的jvm,可以收發郵件玩三維游戲。但是java的夢想並不完全變為現實,java誕生快5年了可是我至今還沒有用到那個聽上去神乎其神的字處理軟件,而且一個java的程序傳道我機器上時我已經數不清我的心髒跳過多少下了。慢的離譜的速度,千奇百怪的配置環境,處處受限制的功能等等不能不讓人懷疑它的前景。
  
  MS呢?向來以軟件漏洞百出,過於龐大的系統(2000龐大的令人難以相信)成為指責的對象。 如今MS也正在逐漸的擺脫原來windows包辦一切的“母集”方式。逐漸走向客戶端的移動化和可伸縮化。但是他們認為仍然需要
  
  保持一個龐大的應用系統,但是不是在客戶機上而是服務器端。
  
  我們可以看到c#基本上實現了java大多數功能。但是唯一一個功能c#是相當弱的那就是跨平台。C#可不可以跨平台?當然可以,但是必須在另一個系統上實現另一套功能相同的CLR和jit。也許在pc,小型機上可以做到。但是手持設備,手機上如何實現如此龐大的一個CLR和jit呢?
  
  因此c#是健壯的,面向對象的,可伸縮的,但是的跨平台方面要弱的多。但是MS認為xml可以彌補c#的不足。
  
  Ms的理想是這樣的:在.NET上實現VOS,保證各種語言都能共享,其次保證
  
  運行的健壯性。然後是在各種大型的服務器上都移植一套CLR和jit.讓在.NET上運行的各種軟件都獲得跨平台的特性。在客戶端,用戶並不直接與.net打交道,而是通過xml,用XUI處理GUI界面,用SOAP調用.NET服務上各種軟件服務然後服務收費。
  
  這就是.net和java,你認為將來我們會是一個什麼樣的世界呢?  

上一頁  [1] [2] [3] [4] 

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