C#是微軟公司發(fā)布的一種面向?qū)ο蟮摹⑦\(yùn)行于.NET Framework之上的高級(jí)程序設(shè)計(jì)語(yǔ)言
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
C#是微軟公司發(fā)布的一種面向?qū)ο蟮摹⑦\(yùn)行于.NET Framework之上的高級(jí)程序設(shè)計(jì)語(yǔ)言。并定于在微軟職業(yè)開(kāi)發(fā)者論壇(PDC)上登臺(tái)亮相。C#是微軟公司研究員Anders Hejlsberg的最新成果。C#看起來(lái)與Java有著驚人的相似;它包括了諸如單一繼承、接口、與Java幾乎同樣的語(yǔ)法和編譯成中間代碼再運(yùn)行的過(guò)程。但是C#與Java有著明顯的不同,它借鑒了Delphi的一個(gè)特點(diǎn),與COM(組件對(duì)象模型)是直接集成的,而且它是微軟公司 .NET windows網(wǎng)絡(luò)框架的主角。 C#是一種安全的、穩(wěn)定的、簡(jiǎn)單的、優(yōu)雅的,由C和C++衍生出來(lái)的面向?qū)ο?/A>的編程語(yǔ)言。它在繼承C和C++強(qiáng)大功能的同時(shí)去掉了一些它們的復(fù)雜特性(例如沒(méi)有宏以及不允許多重繼承)。C#綜合了VB簡(jiǎn)單的可視化操作和C++的高運(yùn)行效率,以其強(qiáng)大的操作能力、優(yōu)雅的語(yǔ)法風(fēng)格、創(chuàng)新的語(yǔ)言特性和便捷的面向組件編程的支持成為.NET開(kāi)發(fā)的首選語(yǔ)言。[1] C#是面向?qū)ο?/A>的編程語(yǔ)言。它使得程序員可以快速地編寫(xiě)各種基于MICROSOFT .NET平臺(tái)的應(yīng)用程序,MICROSOFT .NET提供了一系列的工具和服務(wù)來(lái)最大程度地開(kāi)發(fā)利用計(jì)算與通訊領(lǐng)域。 C#使得C++程序員可以高效的開(kāi)發(fā)程序,且因可調(diào)用由 C/C++ 編寫(xiě)的本機(jī)原生函數(shù),因此絕不損失C/C++原有的強(qiáng)大的功能。因?yàn)檫@種繼承關(guān)系,C#與C/C++具有極大的相似性,熟悉類(lèi)似語(yǔ)言的開(kāi)發(fā)者可以很快的轉(zhuǎn)向C#。[2] 外文名 C# 別 稱 C SHARP 類(lèi) 別 面向?qū)ο缶幊陶Z(yǔ)言 發(fā)布時(shí)間 2000年6月 發(fā)布單位 微軟公司 開(kāi)發(fā)者 安德斯·海爾斯伯格 目錄1歷史發(fā)展編輯C#是微軟公司在2000年6月發(fā)布的一種新的編程語(yǔ)言,主要由安德斯·海爾斯伯格(Anders Hejlsberg)主持開(kāi)發(fā),它是第一個(gè)面向組件的編程語(yǔ)言,其源碼會(huì)編譯成msil再運(yùn)行。它借鑒了Delphi的一個(gè)特點(diǎn),與COM(組件對(duì)象模型)是直接集成的,并且新增了許多功能及語(yǔ)法糖,而且它是微軟公司.NET windows網(wǎng)絡(luò)框架的主角。[3] C#讀作C Sharp。最初它有個(gè)更酷的名字,叫做COOL。微軟從1998年12月開(kāi)始了COOL項(xiàng)目,直到2000年2月,COOL被正式更名為C#。在1998年,Delphi語(yǔ)言的設(shè)計(jì)者Hejlsberg帶領(lǐng)著Microsoft公司的開(kāi)發(fā)團(tuán)隊(duì),開(kāi)始了第一個(gè)版本C#語(yǔ)言的設(shè)計(jì)。在2000年9月,國(guó)際信息和通信系統(tǒng)標(biāo)準(zhǔn)化組織為C#語(yǔ)言定義了一個(gè)Microsoft公司建議的標(biāo)準(zhǔn)。最終C#語(yǔ)言在2001年得以正式發(fā)布。 原Broland公司的首席研發(fā)設(shè)計(jì)師安德斯·海爾斯伯格(An ders Hejlsberg)在微軟開(kāi)發(fā)了Visual J++ 1.0,很快的Visual J++由1.1版本升級(jí)到6.0版。SUN公司認(rèn)為Visual J++ 違反了Java開(kāi)發(fā)平臺(tái)的中立性,對(duì)微軟提出了訴訟。2000年6月26日微軟在奧蘭多舉行的“職業(yè)開(kāi)發(fā)人員技術(shù)大會(huì)”(PDC 2000)上,發(fā)表新的語(yǔ)言C#。C#語(yǔ)言取代了Visual J++,語(yǔ)言本身深受 Java、C 和 C++ 的影響。[5] C#是兼顧系統(tǒng)開(kāi)發(fā)和應(yīng)用開(kāi)發(fā)的最佳實(shí)用語(yǔ)言,并且很有可能成為編程語(yǔ)言歷史上的第一個(gè)“全能”型語(yǔ)言。看過(guò)這篇簡(jiǎn)史,不要把C#看成年輕后生了——只要是“馬拉多納”,就早晚當(dāng)“球王”。C#1.0,純粹的面向?qū)ο?/A>。[6] 1998年底,微軟正在忙于新一代COM的設(shè)計(jì)工作,COM一直是組件化開(kāi)發(fā)中非常成功的一種技術(shù);但由于它僅提供了二進(jìn)制層面上的統(tǒng)一,因此無(wú)法將類(lèi)型信息和用于支持基礎(chǔ)平臺(tái)和開(kāi)發(fā)工具的信息放到組件中,Java逐步走向成熟。微軟學(xué)習(xí)Java的做法,將虛擬機(jī)的概念引入到了COM領(lǐng)域;同時(shí),微軟提出了“元數(shù)據(jù)”的概念,用于描述組件的類(lèi)型信息和工具支持信息,并決定將其放入到組件當(dāng)中。[7] 1998年12月,微軟啟動(dòng)了一個(gè)全新的語(yǔ)言項(xiàng)目——COOL,這是一款專門(mén)為CLR設(shè)計(jì)的純面向?qū)ο蟮恼Z(yǔ)言,也正是本文的主角——C#的前身。[8] 2000年2月份,微軟才正式將COOL語(yǔ)言更名為C#。據(jù)說(shuō)起這個(gè)名字是因?yàn)镃#開(kāi)發(fā)小組的人很討厭搜索引擎,因此把大部分搜索引擎無(wú)法識(shí)別的“#”字符作為該語(yǔ)言名字的一部分;還有一種說(shuō)法是在音樂(lè)當(dāng)中“#”是升調(diào)記號(hào),表達(dá)了微軟希望它在C的基礎(chǔ)上更上一層樓的美好愿望——當(dāng)然這些都只是傳說(shuō),無(wú)從考證。又是歷經(jīng)了一系列的修改,微軟終于在2000年7月發(fā)布了C#語(yǔ)言的第一個(gè)預(yù)覽版。[8] 2設(shè)計(jì)目標(biāo)編輯C#旨在設(shè)計(jì)成為一種“簡(jiǎn)單、現(xiàn)代、通用”,以及面向?qū)ο蟮?A target=_blank>程序設(shè)計(jì)語(yǔ)言,此種語(yǔ)言的實(shí)現(xiàn),應(yīng)提供對(duì)于以下軟件工程要素的支持:強(qiáng)類(lèi)型檢查、數(shù)組維度檢查、未初始化的變量引用檢測(cè)、自動(dòng)垃圾收集(Garbage Collection,指一種自動(dòng)內(nèi)存釋放技術(shù))。軟件必須做到強(qiáng)大、持久,并具有較強(qiáng)的編程生產(chǎn)力。此種語(yǔ)言為在分布式環(huán)境中的開(kāi)發(fā)提供適用的組件開(kāi)發(fā)應(yīng)用。 為使程序員容易遷移到這種語(yǔ)言,源代碼的可移植性十分重要,尤其是對(duì)于那些已熟悉C和C++的程序員而言。對(duì)國(guó)際化的支持非常重要。C#適合為獨(dú)立和嵌入式的系統(tǒng)編寫(xiě)程序,從使用復(fù)雜操作系統(tǒng)的大型系統(tǒng)到特定應(yīng)用的小型系統(tǒng)均適用。[9-10] 3語(yǔ)言結(jié)構(gòu)編輯類(lèi):在C#中類(lèi)的聲明與C++和Java很相似。但是,不象C++,C#結(jié)構(gòu)體 與類(lèi)是不支持繼承。但是,與Java相同的是,一個(gè)結(jié)構(gòu)體可以實(shí)現(xiàn)接口(interface)。Java的關(guān)鍵字import已經(jīng)被替換成using,它起到了同樣的作用。 類(lèi)可以是抽象的和不可繼承的:一個(gè)被申明成abstract的類(lèi)不能被實(shí)例化,它只能被用做一個(gè)基類(lèi),C#關(guān)鍵字lock就像Java關(guān)鍵字final,它申明一個(gè)類(lèi)不是抽象的,但是它也不能被用做另一個(gè)類(lèi)的基類(lèi)界面:就象在Java中一樣,一個(gè)界面是一組方法集合的抽象定義。當(dāng)一個(gè)類(lèi)或結(jié)構(gòu)體實(shí)現(xiàn)一個(gè)界面的時(shí)候,它必須實(shí)現(xiàn)這個(gè)界面中定義的所有方法。一個(gè)單一的類(lèi)可以實(shí)現(xiàn)幾個(gè)界面,也許以后會(huì)出現(xiàn)一些微妙的差別,但是這個(gè)特點(diǎn)看起來(lái)與Java相比沒(méi)有變化。[12] 在Java中,一個(gè)接口是一組方法集合的抽象定義.當(dāng)一個(gè)類(lèi)或結(jié)構(gòu)體實(shí)現(xiàn)一個(gè)接口的時(shí)候,它必須實(shí)現(xiàn)這個(gè)接口中定義的所有方法.一個(gè)單一的類(lèi)可以實(shí)現(xiàn)幾個(gè)接口.也許以后會(huì)出現(xiàn)一些微妙的差別,但是這個(gè)特點(diǎn)看起來(lái)與Java相比沒(méi)有變化。布爾運(yùn)算:條件表達(dá)式的結(jié)果是布爾數(shù)據(jù)類(lèi)型,布爾數(shù)據(jù)類(lèi)型是這種語(yǔ)言中獨(dú)立的一種數(shù)據(jù)類(lèi)型.從布爾類(lèi)型到其他類(lèi)型沒(méi)有直接的轉(zhuǎn)換過(guò)程.布爾常量true和false是C#中的關(guān)鍵字.錯(cuò)誤處理:如Java中那樣,通過(guò)拋出和捕捉異常對(duì)象來(lái)管理錯(cuò)誤處理過(guò)程.內(nèi)存管理:由底層.NET框架進(jìn)行自動(dòng)內(nèi)存垃圾回收。 布爾運(yùn)算:條件表達(dá)式的結(jié)果是布爾數(shù)據(jù)類(lèi)型,布爾數(shù)據(jù)類(lèi)型是這種語(yǔ)言中獨(dú)立的一種數(shù)據(jù)類(lèi)型,從布爾類(lèi)型到其他類(lèi)型沒(méi)有直接的轉(zhuǎn)換過(guò)程,布爾常量true和false是C#中的關(guān)鍵字。錯(cuò)誤處理:如Java中那樣,通過(guò)拋出和捕捉異常對(duì)象來(lái)管理錯(cuò)誤處理過(guò)程。[13] 內(nèi)存管理:由底層.NET框架進(jìn)行自動(dòng)內(nèi)存垃圾回收。一個(gè)基本的C#類(lèi)中包含數(shù)據(jù)成員、屬性、構(gòu)造器和方法。屬性可以是靜態(tài)或?qū)嵗蓡T。 接口:是其他類(lèi)型為確保它們支持某些操作而實(shí)現(xiàn)的引用類(lèi)型。接口從不直接創(chuàng)建而且沒(méi)有實(shí)際的表示形式,其他類(lèi)型必須轉(zhuǎn)換為接口類(lèi)型。 強(qiáng)類(lèi)型:C#是一個(gè)強(qiáng)類(lèi)型的語(yǔ)言,它的數(shù)值類(lèi)型有一些可以進(jìn)行隱式轉(zhuǎn)換,其他的必須顯式轉(zhuǎn)換,隱式轉(zhuǎn)換的類(lèi)型只能是長(zhǎng)度短的類(lèi)型轉(zhuǎn)換成長(zhǎng)的類(lèi)型,int可以轉(zhuǎn)換成long、float、double、decimal,反之必須顯式的轉(zhuǎn)換。 編譯:程序直接編譯成標(biāo)準(zhǔn)的二進(jìn)制可執(zhí)行形式.但C#的源程序并不是被編譯成二進(jìn)制可執(zhí)行形式,而是一種中間語(yǔ)言(IL),類(lèi)似于JAVA字節(jié)碼。如果前面的Hello World程序被保存成一個(gè) C#程序不能直接編譯成標(biāo)準(zhǔn)的二進(jìn)制可執(zhí)行形式,與 Java 類(lèi)似,它被編譯成為中間代碼(Microsoft Intermediate Language),然后通過(guò) .NET Framework 的虛擬機(jī)——被稱之為通用語(yǔ)言執(zhí)行層(Common Language Runtime, CLR)——執(zhí)行。 一個(gè)C#的結(jié)構(gòu)體與C++的結(jié)構(gòu)體是相似的,因?yàn)樗軌虬瑪?shù)據(jù)聲明和方法.但是,不象C++,C#結(jié)構(gòu)體與類(lèi)是不同的而且不支持繼承.但是,與Java相同的是,一個(gè)結(jié)構(gòu)體可以實(shí)現(xiàn)接口。 預(yù)編譯:C# 中存在預(yù)編譯指令支持條件編譯,警告,錯(cuò)誤報(bào)告和編譯行控制.可用的預(yù)編譯指令有:#define,#undef,#if,#elif,#else,#endif,#warning,#error,#line。[15] 沒(méi)有了#include偽指令,無(wú)法再用#define 語(yǔ)句對(duì)符號(hào)賦值,所以就不存在源代碼替換的概念--這些符號(hào)只能用在#if和#elif偽指令里.在#line偽指令里的數(shù)字(和可選的名字)能夠修改行號(hào)還有#warning和#error輸出結(jié)果的文件名。[16] 操作符重載:一些操作符能夠被重載,而另一些則不能.特別的是,沒(méi)有一個(gè)賦值運(yùn)算符能夠被重載.能夠被重載的單目操作符是:+ - ! ~ ++ -- true false 能夠被重載的二元運(yùn)算符是:+、 - 、*、 /、 %、 &、 |、 ^、 << 、>>、 ==、 !=、 >、 < 、>= 、<=。[17] 類(lèi)型:C# 中的類(lèi)型一共分為兩類(lèi),一類(lèi)是值類(lèi)型(Value Type),一類(lèi)是引用類(lèi)型(Reference Type)。值類(lèi)型和引用類(lèi)型是以它們?cè)谟?jì)算機(jī)內(nèi)存中是如何被分配的來(lái)劃分的。值類(lèi)型包括 結(jié)構(gòu)和枚舉,引用類(lèi)型包括類(lèi)、接口、委托 等。還有一種特殊的值類(lèi)型,稱為簡(jiǎn)單類(lèi)型(Simple Type),比如 byte,int等,這些簡(jiǎn)單類(lèi)型實(shí)際上是FCL類(lèi)庫(kù)類(lèi)型的別名,比如聲明一個(gè)int類(lèi)型,實(shí)際上是聲明一個(gè)System. Int32結(jié)構(gòu)類(lèi)型。因此,在 Int32類(lèi)型中定義的操作,都可以應(yīng)用在int類(lèi)型上,比如 “123.Equals(2)”。 所有的值類(lèi)型都隱式地繼承自System.ValueType類(lèi)型(注意System.ValueType本身是一個(gè)類(lèi)類(lèi)型),System.ValueType和所有的引用類(lèi)型都 繼承自 System.Object基類(lèi)。不能顯式地讓結(jié)構(gòu)繼承一個(gè)類(lèi),因?yàn)镃#不支持多重繼承,而結(jié)構(gòu)已經(jīng)隱式繼承自ValueType。 NOTE:堆棧(stack)是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中,變量會(huì)被分配在堆棧上來(lái)進(jìn)行操作。堆(heap)是用于為類(lèi)型實(shí)例(對(duì)象)分配空間的內(nèi)存區(qū)域,在堆上創(chuàng)建一個(gè)對(duì)象,會(huì)將對(duì)象的地址傳給堆棧上的變量(反過(guò)來(lái)叫變量指向此對(duì)象,或者變量引用此對(duì)象)。[18] 中間代碼:微軟在用戶選擇何時(shí)MSIL應(yīng)該編譯成機(jī)器碼的時(shí)候 是留了很大的余地.微軟公司很小心的聲稱MSIL不是解釋性的,而是被編譯成了機(jī)器碼.它也明白許多--如果不是大多數(shù)的話--程序員認(rèn)為Java程序要不可避免的比C編寫(xiě)的任何東西都要慢.而這種實(shí)現(xiàn)方式?jīng)Q定了基于MSIL的程序(指的是用C#,Visual Basic,"Managed C++"--C++的一個(gè)符合CLS的版本--等語(yǔ)言編寫(xiě)的程序)將在性能上超過(guò)"解釋性的"Java代碼.當(dāng)然,這一點(diǎn)還需要得到事實(shí)證明,因?yàn)镃#和其他生成MSIL的編譯器還沒(méi)有發(fā)布.但是Java JIT編譯器的普遍存在使得Java和C#在性能上相對(duì)相同.象"C#是編譯語(yǔ)言而Java是解釋性的,"之類(lèi)的聲明只是商業(yè)技巧.Java的中間代碼和MSIL都是中間的匯編形式的語(yǔ)言,它們?cè)谶\(yùn)行時(shí)或其它的時(shí)候被編譯成機(jī)器代碼。[20] 4數(shù)據(jù)類(lèi)型編輯基本數(shù)據(jù)類(lèi)型:C#擁有比C/C++或者Java更廣泛的數(shù)據(jù)類(lèi)型.這些類(lèi)型是bool、byte、ubyte、short、ushort、int、uint、long、ulong、float、double和decimal,像Java一樣,所有這些類(lèi)型都有一個(gè)固定的大小.又像C和C++一樣,每個(gè)數(shù)據(jù)類(lèi)型都有有符號(hào)和無(wú)符號(hào)兩種類(lèi)型.與Java相同的是,一個(gè)字符變量包含的是一個(gè)16位的Unicode字符,C#新的數(shù)據(jù)類(lèi)型是decimal數(shù)據(jù)類(lèi)型,對(duì)于貨幣數(shù)據(jù),它能存放28位10進(jìn)制數(shù)字。[20] 兩個(gè)基本類(lèi):一個(gè)名叫object的類(lèi)是所有其他類(lèi)的基類(lèi)。而一個(gè)名叫string的類(lèi)也象object一樣是這個(gè)語(yǔ)言的一部分.作為語(yǔ)言的一部分存在意味著編譯器有可能使用它,無(wú)論何時(shí)在程序中寫(xiě)入一句帶引號(hào)的字符串,編譯器會(huì)創(chuàng)建一個(gè)string對(duì)象來(lái)保存它。[20] 參數(shù)傳遞:方法可以被聲明接受可變數(shù)目的參數(shù).缺省的參數(shù)傳遞方法是對(duì)基本數(shù)據(jù)類(lèi)型進(jìn)行值傳遞。ref關(guān)鍵字可以用來(lái)強(qiáng)迫一個(gè)變量通過(guò)引用傳遞,這使得一個(gè)變量可以接受一個(gè)返回值。out關(guān)鍵字也能聲明引用傳遞過(guò)程,與ref不同的地方是,它指明這個(gè)參數(shù)并不需要初始值。[20] COM的集成:C#對(duì)Windows程序最大的賣(mài)點(diǎn)可能就是它與COM的無(wú)縫集成了,COM就是微軟的Win32組件技術(shù).實(shí)際上,最終有可能在任何.NET語(yǔ)言里編寫(xiě)COM客戶和服務(wù)器端。C#編寫(xiě)的類(lèi)可以子類(lèi)化一個(gè)已存在的COM組件;生成的類(lèi)也能被作為一個(gè)COM組件使用,然后又能使用,比方說(shuō),JScript語(yǔ)言子類(lèi)化它從而得到第三個(gè)COM組件。這種現(xiàn)象的結(jié)果是導(dǎo)致了一個(gè)運(yùn)行環(huán)境的產(chǎn)生,在這個(gè)環(huán)境里的組件是網(wǎng)絡(luò)服務(wù),可用任何.NET語(yǔ)言子類(lèi)化。[20] 索引下標(biāo):一個(gè)索引與屬性除了不使用屬性名來(lái)引用類(lèi)成員而是用一個(gè)方括號(hào)中的數(shù)字來(lái)匿名引用(就象用數(shù)組下標(biāo)一樣)以外是相似的。[20] 代理和反饋:一個(gè)代理對(duì)象包括了訪問(wèn)一個(gè)特定對(duì)象的特定方法所需的信息.只要把它當(dāng)成一個(gè)聰明的方法指針就行了。代理對(duì)象可以被移動(dòng)到另一個(gè)地方,然后可以通過(guò)訪問(wèn)它來(lái)對(duì)已存在的方法進(jìn)行類(lèi)型安全的調(diào)用.一個(gè)反饋方法是代理的特例.event關(guān)鍵字用在將在事件發(fā)生的時(shí)候被當(dāng)成代理調(diào)用的方法聲明中。[20] 5程序執(zhí)行編輯C#所開(kāi)發(fā)的程序源代碼并不是編譯成能夠直接在操作系統(tǒng)上執(zhí)行的二進(jìn)制本地代碼。與Java類(lèi)似,它被編譯成為中間代碼,然后通過(guò).NET Framework的虛擬機(jī)——被稱之為通用語(yǔ)言運(yùn)行時(shí)(CLR)——執(zhí)行。 所有的.Net編程語(yǔ)言都被編譯成這種被稱為MSIL(Microsoft Intermediate Language )的中間代碼。因此雖然最終的程序在表面上仍然與傳統(tǒng)意義上的可執(zhí)行文件都具有“.exe”的后綴名。但是實(shí)際上,如果計(jì)算機(jī)上沒(méi)有安裝.Net Framework,那么這些程序?qū)⒉荒軌虮粓?zhí)行。 在程序執(zhí)行時(shí),.Net Framework將中間代碼翻譯成為二進(jìn)制機(jī)器碼,從而使它得到正確的運(yùn)行。最終的二進(jìn)制代碼被存儲(chǔ)在一個(gè)緩沖區(qū)中。所以一旦程序使用了相同的代碼,那么將會(huì)調(diào)用緩沖區(qū)中的版本。這樣如果一個(gè).Net程序第二次被運(yùn)行,那么這種翻譯不需要進(jìn)行第二次,速度明顯加快。[21] 6關(guān)鍵字編輯
部分描述: abstract:可以和類(lèi)、方法、屬性、索引器及事件一起使用,標(biāo)識(shí)一個(gè)可以擴(kuò)展但不能被實(shí)體化的、必須被實(shí)現(xiàn)的類(lèi)或方法。 as:一個(gè)轉(zhuǎn)換操作符,如果轉(zhuǎn)換失敗,就返回null。 base:用于訪問(wèn)被派生類(lèi)或構(gòu)造中的同名成員隱藏的基類(lèi)成員。 catch:定義一個(gè)代碼塊,在特定類(lèi)型異常拋出時(shí),執(zhí)行塊內(nèi)代碼。 checked:既是操作符又是語(yǔ)句,確保編譯器運(yùn)行時(shí),檢查整數(shù)類(lèi)型操作或轉(zhuǎn)換時(shí)出現(xiàn)的溢出。 const:標(biāo)識(shí)一個(gè)可在編譯時(shí)計(jì)算出來(lái)的變量值,即一經(jīng)指派不可修改的值。 delegate:指定一個(gè)聲明為一種委托類(lèi)型。委托把方法封裝為可調(diào)用實(shí)體,能在委托實(shí)體中調(diào)用。 enum:表示一個(gè)已命名常量群集的值類(lèi)型。 event:允許一個(gè)類(lèi)或?qū)ο筇峁┩ㄖ某蓡T,他必須是委托類(lèi)型。 explicit:一個(gè)定義用戶自定義轉(zhuǎn)換操作符的操作符,通常用來(lái)將內(nèi)建類(lèi)型轉(zhuǎn)換為用戶定義類(lèi)型或反向操作,必須再轉(zhuǎn)換時(shí)調(diào)用顯示轉(zhuǎn)換操作符。 extern:標(biāo)識(shí)一個(gè)將在外部(通常不是c#語(yǔ)言)實(shí)現(xiàn)的方法。 finally:定義一個(gè)代碼塊,在程序控制離開(kāi)try代碼快后執(zhí)行。參見(jiàn)try和catch。 fixed:在一個(gè)代碼塊執(zhí)行時(shí),在固定內(nèi)存位置為一個(gè)變量指派一個(gè)指針。 foreach:用于遍歷一個(gè)群集的元素。 goto:一個(gè)跳轉(zhuǎn)語(yǔ)句,將程序執(zhí)行重定向到一個(gè)標(biāo)簽語(yǔ)句。 implicit:一個(gè)操作符,定義一個(gè)用戶定義的轉(zhuǎn)換操作符,通常用來(lái)將預(yù)定義類(lèi)型轉(zhuǎn)換為用戶定義類(lèi)型或反向操作,隱式轉(zhuǎn)換操作符必須在轉(zhuǎn)換時(shí)使用。 interface:將一個(gè)聲明指定為接口類(lèi)型,即實(shí)現(xiàn)類(lèi)或構(gòu)造必須遵循的合同。 internal:一個(gè)訪問(wèn)修飾符。 namespace:定義一個(gè)邏輯組的類(lèi)型和命名空間。 operator:用來(lái)聲明或多載一個(gè)操作符。 out:標(biāo)識(shí)一個(gè)參數(shù)值會(huì)受影響的參數(shù),但在傳入方法時(shí),該參數(shù)無(wú)需先初始化。 params:聲明一個(gè)參數(shù)數(shù)組。如果使用,必須修改指定的最后一個(gè)參數(shù),允許可選參數(shù)。 readonly:標(biāo)識(shí)一個(gè)變量的值在初始化后不可修改。 ref:標(biāo)識(shí)一個(gè)參數(shù)值可能會(huì)受影響的參數(shù)。 sealed:防止類(lèi)型被派生,防止方法和property被覆載。 sizeof:一個(gè)操作符,以byte為單位返回一個(gè)值類(lèi)型的長(zhǎng)度。 stackalloc:返回在堆上分配的一個(gè)內(nèi)存塊的指針。 struct:是一種值類(lèi)型,可以聲明常量、字段、方法、property、索引器、操作符、構(gòu)造器和內(nèi)嵌類(lèi)型。 throw:拋出一個(gè)異常。 try:異常處理代碼塊的組成部分之一。try代碼塊包括可能會(huì),拋出異常的代碼。參閱catch和finally關(guān)鍵字。 typeof:一個(gè)操作符,返回傳入?yún)?shù)的類(lèi)型。 unchecked:禁止溢出檢查。 unsafe:標(biāo)注包含指針操作的代碼塊、方法或類(lèi)。 using:當(dāng)用于命名空間時(shí),using關(guān)鍵字允許訪問(wèn)該命名空間中的類(lèi)型,而無(wú)需指定其全名。也用于定義finalization操作的范圍。 virtual:一個(gè)方法修飾符,標(biāo)識(shí)可被覆載的方法。 7版本介紹編輯C# 1.0-純粹的面向?qū)ο?/B> 這一時(shí)期的C#(以下稱為C# 1.x)提出了純粹的面向?qū)ο蟾拍睢++并非純面向?qū)ο?/A>的,為了和C兼容以及提供更高的執(zhí)行效率,它保留了很多模塊化的東西。C#還通過(guò)類(lèi)類(lèi)型、值類(lèi)型和接口類(lèi)型的概念形成了統(tǒng)一的類(lèi)型系統(tǒng)。[24] 盡管C# 1.x提供了如此多的新鮮概念,但實(shí)際上,這些概念都是由CLI提出的。因此當(dāng)將一個(gè)C#源程序編譯為可執(zhí)行文件時(shí),編譯器做的工作相對(duì)而言并不多。需要編譯器代勞的是要將一個(gè)簡(jiǎn)單的委托定義語(yǔ)句翻譯為一個(gè)繼承System.MulticastDelegate類(lèi)型定義。[24] C# 2.0-泛型編程新概念 微軟在2004年的6月份發(fā)布了Visual Studio2005的第一個(gè)Beta 版,同時(shí)向開(kāi)發(fā)者展示了C#語(yǔ)言的2.0版本。2005年4月,微軟發(fā)布了Visual Studio 2005 Beta2,這已經(jīng)是具備了幾乎全部功能的VisualStudio,包括的產(chǎn)品有SQL Server2005、Team Foundation Server和TeamSuite。這時(shí)的C#編譯器已經(jīng)能夠處理C# 2.0中所有的新特性。[25] C# 2.0為開(kāi)發(fā)者帶來(lái)的最主要的特性就是泛型編程能力。和面向?qū)? 象思想一樣,泛型思想也是一種已經(jīng)成熟的編程思想,但依然是沒(méi)有哪一種主流開(kāi)發(fā)語(yǔ)言能夠支持完備的泛型概念。這主要是因?yàn)榉盒偷母拍钤谝欢ǔ潭壬蠈?duì)面向?qū)ο蟾拍钸M(jìn)行沖擊,同時(shí),由于在編譯期間對(duì)類(lèi)型參數(shù)的完全檢測(cè)很難做到,很多問(wèn)題會(huì)被遺留到運(yùn)行時(shí)。C# 2.0別出心裁,對(duì)泛型類(lèi)型參數(shù)提出了“約束”的新概念,并以優(yōu)雅的語(yǔ)法體現(xiàn)在語(yǔ)言之中。有了約束,結(jié)合編譯器強(qiáng)大的類(lèi)型推斷能力,可以在編譯時(shí)發(fā)現(xiàn)幾乎所有“危險(xiǎn)”的泛型應(yīng)用。[27] C# 2.0的另一個(gè)突出的特性就是匿名方法,用來(lái)取代一些短小的并且僅出現(xiàn)一次的委托,使得語(yǔ)言結(jié)構(gòu)更加緊湊。匿名方法除了可以使得事件處理器的編寫(xiě)更加精簡(jiǎn)以外,還將開(kāi)發(fā)者帶入了程序設(shè)計(jì)的一個(gè)新的領(lǐng)域——函數(shù)式編程,曾經(jīng)有高人就用匿名方法結(jié)合泛型編程實(shí)現(xiàn)了函數(shù)式編程中的重要結(jié)構(gòu)—— Lambda 表達(dá)式。盡管這種實(shí)現(xiàn)顯得很繁瑣而且不易理解,但畢竟是實(shí)現(xiàn)了。 C#3.0-(研發(fā)代號(hào)“Orcas”) 2005年9 月份的PDC大會(huì)——C#3.0(研發(fā)代號(hào)“Orcas”——魔鬼)的技術(shù)預(yù)覽版。說(shuō)到C# 3.0,就不得不提一下微軟的LINQ 項(xiàng)目,LINQ(語(yǔ)言集成查詢,Language Integrat ed Query)提出了一種通過(guò)面向?qū)ο笳Z(yǔ)法來(lái)實(shí)現(xiàn)對(duì)非面向?qū)ο髷?shù)據(jù)源的查詢技術(shù),可查詢的數(shù)據(jù)源從關(guān)系型數(shù)據(jù)庫(kù)延伸到一般意義上的集合(如數(shù)組和列表)以及XML。而C# 3.0則是率先實(shí)現(xiàn)了LINQ的語(yǔ)言。 在C# 3.0中,可以用類(lèi)似于SQL語(yǔ)句的語(yǔ)法從一個(gè)數(shù)據(jù)源中輕松地得到滿足一定條件的對(duì)象集合。例如要查找一個(gè)字符串?dāng)?shù)組names中所有長(zhǎng)度大于5的字符串,就可以寫(xiě):var longname = from n in names wheren.Length > 5 select n; 這樣就得到一個(gè)新的字符數(shù)組longname,其中包含了所需要的結(jié)果。這種語(yǔ)句稱作查詢語(yǔ)句,與SQL語(yǔ)句唯一的區(qū)別是C#中的查詢語(yǔ)句往往把select子句放到最后(這反而倒有些類(lèi)似于中文的閱讀順序了)。初次看到這樣一個(gè)語(yǔ)句,可能會(huì)有很大疑問(wèn):這還是C#語(yǔ)言嗎?這的確是合乎語(yǔ)法規(guī)則的C#代碼,而且編譯器可以識(shí)別這種語(yǔ)法。然而實(shí)際上,C#編譯器并不會(huì)對(duì)這種語(yǔ)法進(jìn)行實(shí)際的的編譯,而是將其翻譯為正常的方法調(diào)用。[29-30] C# 4.0動(dòng)態(tài)編程 C# 4.0 新增 dynamic關(guān)鍵字,提供動(dòng)態(tài)編程(dynamic programming),把既有的靜態(tài)物件標(biāo)記為動(dòng)態(tài)物件,類(lèi)似javascript, Python 或 Ruby[31-32] 。 8發(fā)展前景編輯根據(jù)育龍網(wǎng)資料評(píng)價(jià)顯示:C#幾乎集中了所有關(guān)于軟件開(kāi)發(fā)和軟件工程研究的最新成果:面向?qū)ο蟆㈩?lèi)型安全、組件技術(shù)、自動(dòng)內(nèi)存管理、跨平臺(tái)異常處理、版本控制、代碼安全管理……。盡管像很多人注意到的一樣,羅列上述特性時(shí),總是讓人想到JAVA,然而C# 確實(shí)走得更遠(yuǎn)。但現(xiàn)實(shí)的情況是,非技術(shù)的因素往往更能決定一個(gè)產(chǎn)品的未來(lái),尤其在計(jì)算機(jī)軟件的歷史上,技術(shù)卓越的產(chǎn)品,如OS/2、Mac OS、UNIX等,都敗在了Windows漂亮的界面上。JAVA的用戶主要是網(wǎng)絡(luò)服務(wù)的開(kāi)發(fā)者和嵌入式設(shè)備軟件的開(kāi)發(fā)者,嵌入式設(shè)備軟件不是C# 的用武之地,而在網(wǎng)絡(luò)服務(wù)方面,C# 的即時(shí)編譯和本地代碼Cache方案比JAVA虛擬機(jī)具有絕對(duì)的性能優(yōu)勢(shì)。何況C# 一旦成為一個(gè)像C++ 一樣的公共的標(biāo)準(zhǔn),軟件開(kāi)發(fā)商既可以省去JAVA的許可證費(fèi)用,也不必?fù)?dān)心成為微軟的奴隸,那些反微軟的人士和主張廠商獨(dú)立的人士可能也不會(huì)有什么意見(jiàn)。這可能正是微軟所期待的。[33] 如果把C# 和 JAVA 在網(wǎng)絡(luò)服務(wù)領(lǐng)域的爭(zhēng)奪比作未來(lái)制空權(quán)的爭(zhēng)奪,那么C# 和傳統(tǒng)通用快速開(kāi)發(fā)工具——VB、DELPHI等的較量將是地地道道的白刃戰(zhàn)。可能最慘的程序員就是VB程序員,在微軟,VB就像離任的克林頓,不但失去了所有的光輝,而且亂事纏身。[33] 其實(shí)在編程語(yǔ)言中真正的霸主多年來(lái)一直是C++,所有的操作系統(tǒng)和絕大多數(shù)的商品軟件都是用C++作為主要開(kāi)發(fā)語(yǔ)言的。JAVA的程序員絕大多數(shù)也是C++的愛(ài)好者,PHP的成功里面也有類(lèi)似C++的語(yǔ)法的功勞。在操作系統(tǒng)、設(shè)備驅(qū)動(dòng)程序、視頻游戲等領(lǐng)域,C++在很長(zhǎng)的時(shí)間內(nèi)仍將占據(jù)主要地位,而在數(shù)量最大的應(yīng)用軟件的開(kāi)發(fā)上,C# 很可能取代C++的位置。首先,C# 和JAVA一樣,簡(jiǎn)直就是照搬了C++的部分語(yǔ)法,因此,對(duì)于數(shù)量眾多的C++程序員學(xué)習(xí)起來(lái)很容易上手,另外,對(duì)于新手來(lái)說(shuō),比C++要簡(jiǎn)單一些。其次,Windows是占?jí)艛嗟匚坏钠脚_(tái),而開(kāi)發(fā)Windows應(yīng)用,當(dāng)然微軟的聲音是不能忽略的。最重要的是,相對(duì)于C++,用C# 開(kāi)發(fā)應(yīng)用軟件可以大大縮短開(kāi)發(fā)周期,同時(shí)可以利用原來(lái)除用戶界面代碼之外的C++代碼。[33] 但是,C# 也有弱點(diǎn)。首先,在一些版本較舊的Windows平臺(tái)上,C# 的程序還不能運(yùn)行,因?yàn)镃# 程序需要 .NET運(yùn)行庫(kù)作為基礎(chǔ),而 .NET運(yùn)行庫(kù)作為Windows(XP及以后版本)的一部分發(fā)行, Windows Me 和 Windows 2000用戶只能以Service Pack的形式安裝使用。其次,C# 能夠使用的組件或庫(kù)還只有 .NET 運(yùn)行庫(kù)等很少的選擇,沒(méi)有豐富的第三方軟件庫(kù)可用,這需要有一個(gè)過(guò)程,同時(shí)各軟件開(kāi)發(fā)商的支持也很重要。第三,JAVA的成功因素里有一些是反微軟陣營(yíng)的吹捧,雖然“只寫(xiě)一次,到處運(yùn)行”只是一句口號(hào),但畢竟已經(jīng)是一種成熟的技術(shù)。而C# 的鼓吹者只有名聲不佳的微軟,且只能運(yùn)行在Windows上。實(shí)際上這兩種語(yǔ)言都不是不可替代的,理智的說(shuō),對(duì)軟件開(kāi)發(fā)商而言,什么用的最熟什么就是最好的工具。尤其對(duì)C++的使用者,C# 沒(méi)有帶來(lái)任何新東西,因?yàn)?NET運(yùn)行庫(kù)在C++中也可以使用,沒(méi)有要換的絕對(duì)的理由。[33] 該文章在 2014/5/13 23:13:39 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |