C#簡介
C#(讀做 "C SHARP",中文譯音暫時沒有.專業人士一般讀"C sharp",現在很多非專業一般讀"C井"。C#是微軟公司發布的一種面向對象的、運行於.NET Framework之上的高級程式設計語言。並定於在微軟職業開發者論壇(PDC)上登台亮相。C#是微軟公司研究員Anders Hejlsberg的最新成果。C#看起來與Java有著驚人的相似;它包括了諸如單一繼承、接口、與Java幾乎同樣的語法和編譯成中間代碼再運行的過程。但是C#與Java有著明顯的不同,它借鑑了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NET windows網路框架的主角。
C#是一種安全的、穩定的、簡單的,由C和C++衍生出來的面向對象的程式語言。它在繼承C和C++強大功能的同時去掉了一些它們的複雜特性(例如沒有宏和模版,不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優雅的語法風格、創新的語言特性和便捷的面向組件編程的支持成為.NET開發的首選語言。
並且C#成為ECMA與ISO標準規範。C#看似基於C++寫成,但又融入其它語言如Delphi、Java、VB等。
在本文中,我將考察創建一種新計算機語言的一般動機,並將特別指明是什麼原因導致了C#的出現.然後我將介紹C#和它與Java,c,c++的相似之處.其次我將討論一些存在於Java和C#之間的高層次的,和基礎的差別.我將以衡量在用多種語言開發大型應用程式的時候所需的知識(或者對這種知識的缺乏程度)來結束本文,而這正是.NET和C#的一個主要戰略.目前,C#和.NET還只能以C#語言規則,以及Windows 2000的一個"d預覽版本",還有MSDN上迅速增多的文檔集子的形式獲得(還沒有最終定型).
微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要廣泛一些(比如說struts),它還增加了自己新的特點(比方說原始碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進化成一種開發者能夠接受和採用的語言.而微軟當前為它的這種新語言大造聲勢也是值得注意的.目前大家的反應是:"這是對Java的反擊."
C#更象Java一些,雖然微軟在這個問題上保持沉默.這也是意料中的事情,我覺得,因為Java近來很成功而使用Java的公司都報告說它們在生產效率上比C++獲得了提高.
Java所帶來的巨大影響和大家對它的廣泛接受已經由工作於這種語言和平台之上的程式設計師數量明顯的說明了(估計世界範圍內共有兩百五十萬程式設計師使用Java).由這種語言寫成的應用程式的數量是令人驚訝的並已經滲透了每一個級別的計算,包括無線計算和行動電話(比如日本發明的Java電話).C#能夠在用戶領域獲得這樣的禮遇嗎?我們必須等待並觀望,就象已經由SSI公司的CEO和主席Kalpathi S. Suresh指出來的那樣,"我發現所有這些都是漸進的.如果C#不存在,我們總能回到Java或C和C++.這些都不完全是新技術;它們在更大的意義上來說只是大公司製造的市場噱頭.我們必須給他們時間安頓下來看看這些是不是真的對IT工業有什麼影響."
C#從java繼承而來的特點
類:在C#中類的申明與Java很相似.這是合理的因為經驗告訴我們Java模型工作得很好.Java的關鍵字import已經被替換成using,它起到了同樣的作用.一個類開始執行的起點是靜態方法Main().下面的Hello World程式展示了基本的形式:
using System;
class Hello
{
static void Main()
{
Console.WriteLine("Hello, world");
}
}
在這個例子中,System這個名字指向一個包括了基本C#實用類集合的命名空間(namespace).這個命名空間包括了Console類,它在這個例子中被用來輸出一個字元串.類可以是抽象的和不可繼承的:一個被申明成abstract的類不能被實例化;它只能被用做一個基類.C#關鍵字sealed就象java關鍵字final,它申明一個類不是抽象的,但是它也不能被用做另一個類的基類.接口:就象在Java中一樣,一個接口是一組方法集合的抽象定義.當一個類或結構體實現一個接口的時候,它必須實現這個接口中定義的所有方法.一個單一的類可以實現幾個接口.也許以後會出現一些微妙的差別,但是這個特點看起來與Java相比沒有變化.布爾運算:條件表達式的結果是布爾數據類型,布爾數據類型是這種語言中獨立的一種數據類型.從布爾類型到其他類型沒有直接的轉換過程.布爾常量true和false是C#中的關鍵字.錯誤處理:如Java中那樣,通過拋出和捕捉異常對象來管理錯誤處理過程.記憶體管理:由底層.NET框架進行自動記憶體垃圾回收.
C#從C和C++繼承的特點
編譯
程式直接編譯成標準的二進制可執行形式.但C#的源程式並不是被編譯成二進制可執行形式,而是一中中間語言,類似於JAVA位元組碼。如果前面的Hello World程式被保存成一個文本檔案並被命名為Hello.cs,它將被編譯成命名hello.exe的可執行程式.
結構體
一個C#的結構體與C++的結構體是相似的,因為它能夠包含數據聲明和方法.但是,不象C++,C#結構體與類是不同的而且不支持繼承.但是,與Java相同的是,一個結構體可以實現接口.
預編譯
C#中存在預編譯指令支持條件編譯,警告,錯誤報告和編譯行控制.可用的預編譯指令有:
#define
#undef
#if
#elif
#else
#endif
#warning
#error
#line []
沒有了#include 偽指令.你無法再用#define 語句對符號賦值,所以就不存在原始碼替換的概念--這些符號只能用在#if和#elif偽指令里.在#line偽指令里的數字(和可選的名字)能夠修改行號還有#warning和#error輸出結果的檔案名稱.
操作符重載
一些操作符能夠被重載,而另一些則不能.特別的是,沒有一個賦值運算符能夠被重載.能夠被被重載的單目操作符是:
+ - ! ~ ++ -- true false
能夠被重載的二元運算符是:
+ - * / % & | ^ << >> == != > < >= <=
C#獨有的特點
C#最引人入勝的地方是它和Java的不同,而不是相似的地方.這一節(和這個系列第二部分的大部分地方)講述了C#實現的和Java不同的地方或者Java根本沒有的特點.
中間代碼
微軟在用戶選擇何時MSIL應該編譯成機器碼的時候是留了很大的餘地.微軟公司很小心的聲稱MSIL不是解釋性的,而是被編譯成了機器碼.它也明白許多--如果不是大多數的話--程式設計師認為Java程式要不可避免的比C編寫的任何東西都要慢.而這種實現方式決定了基於MSIL的程式(指的是用C#,Visual Basic,"Managed C++"--C++的一個符合CLS的版本--等語言編寫的程式)將在性能上超過"解釋性的"Java代碼.當然,這一點還需要得到事實證明,因為C#和其他生成MSIL的編譯器還沒有發布.但是Java JIT編譯器的普遍存在使得Java和C#在性能上相對相同.象"C#是編譯語言而Java是解釋性的,"之類的聲明只是商業技巧.Java的中間代碼和MSIL都是中間的彙編形式的語言,它們在運行時或其它的時候被編譯成機器代碼.
命名空間中的申明
當你創建一個程式的時候,你在一個命名空間裡創建了一個或多個類.同在這個命名空間裡(在類的外面)你還有可能聲明接口,枚舉類型和結構體.必須使用using關鍵字來引用其他命名空間的內容.
基本的數據類型
C#擁有比C,C++或者Java更廣泛的數據類型.這些類型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,和decimal.象Java一樣,所有這些類型都有一個固定的大小.又象C和C++一樣,每個數據類型都有有符號和無符號兩種類型.與Java相同的是,一個字元變數包含的是一個16位的Unicode字元.C#新的數據類型是decimal數據類型,對於貨幣數據,它能存放28位10進制數字.
兩個基本類
一個名叫object的類是所有其他類的基類.而一個名叫string的類也象object一樣是這個語言的一部分.作為語言的一部分存在意味著編譯器有可能使用它--無論何時你在程式中寫入一句帶引號的字元串,編譯器會創建一個string對象來保存它.
參數傳遞
方法可以被聲明接受可變數目的參數.預設的參數傳遞方法是對基本數據類型進行值傳遞.ref關鍵字可以用來強迫一個變數通過引用傳遞,這使得一個變數可以接受一個返回值.out關鍵字也能聲明引用傳遞過程,與ref不同的地方是,它指明這個參數並不需要初始值.
與COM的集成
C#對Windows程式最大的賣點可能就是它與COM的無縫集成了,COM就是微軟的Win32組件技術.實際上,最終有可能在任何.NET語言裡編寫COM客戶和伺服器端.C#編寫的類可以子類化一個以存在的COM組件;生成的類也能被作為一個COM組件使用,然後又能使用,比方說,JScript語言子類化它從而得到第三個COM組件.這種現象的結果是導致了一個運行環境的產生,在這個環境裡的組件是網路服務,可用用任何.NET語言子類化.
索引下標
一個索引與屬性除了不使用屬性名來引用類成員而是用一個方括弧中的數字來匿名引用(就象用數組下標一樣)以外是相似的.
public class ListBox: Control
{
private string[] items;
public string this[int index]
{
get
{
return items[index];
}
set
{
items[index] = value;
repaint();
}
}
}
可以用一個循環器來匿名引用字元串內部數組成員,就象下面這樣:
ListBox listBox = ...;
listBox[0] = "hello";
Console.WriteLine(listBox[0]);
代理和反饋
一個代理對象包括了訪問一個特定對象的特定方法所需的信息.只要把它當成一個聰明的方法指針就行了.代理對象可以被移動到另一個地方,然後可以通過訪問它來對已存在的方法進行類型安全的調用.一個反饋方法是代理的特例.event關鍵字用在將在事件發生的時候被當成代理調用的方法聲明.
C# 簡史
編者按:時間過得真快,居然現在就可以寫C#的簡史了。但是想想也不奇怪,C#可謂起點高、發展快的新一代語言,它的這五年走過了很多前輩十幾年的路。公允地說,C#是目前兼顧系統開發和套用開發的最佳實用語言,並且很有可能成為程式語言歷史上的第一個“全能”型語言。看過這篇簡史,我們都應該明白,不要再把C#看成年輕後生了——只要是“馬
拉多納”,就早晚當“球王”。
C# 1.0,純粹的面向對象
回溯到1998年底,微軟正在忙於新一代COM的設計工作。此前,COM一直是組件化開發中非常成功的一種技術;但由於它僅提供了二進制層面上的統一,因此無法將類型信息和用於支持基礎平台和開發工具的信息放到組件中。這時,Java正在逐步走向成熟。於是,微軟學習Java的做法,將虛擬機的概念引入到了COM領域;同時,微軟提出了“元數據”的概念,用於描述組件的類型信息和工具支持信息,並決定將其放入到組件當中。這種“COM虛擬機”的名字在經歷了若干爭論後,最終被定為CLR(Common Language Runtime,公共語言運行時)。與此同時,微軟提出了在該運行時上運作的語言應該遵循的一些規則,以及該虛擬機的類型系統和指令集——所有這些規範形成了最終的C L I(Common Language Infrastructure,公共語言基礎設施),並提交給了ECMA委員會。同時,微軟開發了CLI的一個實現,這就是大名鼎鼎的.NET了。
1998年12月,微軟啟動了一個全新的語言項目——COOL,這是一款專門為CLR設計的純面向對象的語言,也正是本文的主角——C#的前身。歷時半年有餘,1999年7月份,微軟完成了COOL語言的一個內部版本。直到2000年2月份,微軟才正式將COOL語言更名為C#。據說起這個名字是因為C#開發小組的人很討厭搜尋引擎,因此把大部分搜尋引擎無法識別的“#” 字元作為該語言名字的一部分;還有一種說法是在音樂當中“#”是升調記號,表達了微軟希望它在C的基礎上更上一層樓的美好願望——當然這些都只是傳說,無從考證。又是歷經了一系列的修改,微軟終於在2000年7月發布了C#語言的第一個預覽版。因此人們一般認為C#是2000年發布的,並以此來計算它的“年齡”。在此後的一年多時間裡,微軟一直在修補各個測試版本中的BUG。直到2002年2月,微軟終於推出了遲遲未上市的Visual Studio 7.0,並將其定名為“VisualStudio .NET 2002”。隨著這套開發環境的出爐,開發者們終於看到了C#語言的第一個正式版本——C# 1.0。此後,微軟馬不停蹄,Visual Studio也恢復了往日的開發進度。在2003年5月,微軟如期推出了Visual Studio .NET 2003,同時也發布了C#的改進版本——C# 1.1。
這一時期的C#(以下稱為C# 1.x)提出了純粹的面向對象概念,並在語言特性中展現得淋漓盡致。C++並非純面向對象的,為了和C兼容以及提供更高的執行效率,它保留了很多模組化的東西。Java儘管號稱是面向對象的,但實際上,對於對象所應該具備的三種構成結構——屬性、方法和事件,Java僅提供了方法,其它兩種結構都要通過方法來模擬。在C# 1.x中,所有面向對象的概念都在語言中得到了非常好的體現。同時,C#還通過類類型、值類型和接口類型的概念形成了統一的類型系統。C#使用了大家所熟知的語法實現了方法,以至於很多人認為C#和Java、C++等面向對象語言“非常相像”,這使得從使用其他面向對象語言轉到使用C#的過程非常簡單。此外,C#還通過無參數列表的方法聲名語法,結合get/set訪問器實現了優雅的屬性語法。其中的get訪問器相當於獲取屬性值的方法,可以通過一些運算返回最終的結果,而不是簡單地返回一個變數的值;而set訪問器相當於設定屬性值的方法,在其中可以進行一系列檢測,最後將屬性值賦給相應的變數。同時,通過同時提供get和set訪問器、只提供get訪問器和只提供set訪問器,還可以很方便地實現可寫、唯讀和只寫的屬性。C#的這種屬性語法,使得一個屬性在提供該屬性的類的內部看來,非常像一組方法;而對於外部調用類看來,訪問一個對象的屬性和訪問它的公共域沒有任何區別。通過委託(稍後介紹),結合關鍵字event,C#提供了優雅的事件概念。使用+=運算符,開發者可以非常方便地將一個事件處理器關聯到一個事件上,這個過程稱之為“訂閱”一個事件。由於委託內部封裝了一個調用鍊表,因此可以方便地為一個事件添加多個事件處理器,這些處理器會自動地依次調用。多年的開發語言進化證明,函式指針是非常重要也是非常危險的語言特徵之一。同時,基於函式指針的回調機制也Windows 核心概念之一。然而,由於函式指針很難驗證參數的類型準確性,因此C#(確切地說是CLI)提出了“委託”的概念,這是一種類型安全的函式指針鍊表。這意味著,C#不僅可以提供回調機制,同時調用回調的一方還無需在其內部維護函式指針列表,所要做的僅僅是聲名一個具有恰當委託類型的公共成員即可;而提供回調的一方也只需通過構造一個帶有指定方法的相應委託實例,並通過“+=”運算符添加到回調列表即可。
儘管C# 1.x提供了如此多的新鮮概念,但實際上,這些概念都是由CLI提出的。因此當將一個C#源程式編譯為執行檔時,編譯器做的工作相對而言並不多。需要編譯器代勞的是要將一個簡單的委託定義語句翻譯為一個繼承System.MulticastDelegate類型定義。
C# 2.0,泛型編程新概念
微軟本打算繼續保證開發進度,並在2004年推出Visual Studio .NET 2004,但由於其間軟體工程學尤其是軟體管理學的大規模進步,微軟所提供的這種僅具備開發和調試功能的IDE已經無法滿足團隊開發的需求。因此微軟決定在項目設計和管理工具方面進行了進一步研發,並將其集成到Visual Studio中,以贏回原有的市場。因此,微軟將Visual studio.net 2004“改名”為Visual Studio 2005,並決定推遲一年發布。不過,微軟還是堅持在2004年的6月份發布了Visual Studio2005的第一個Beta 版,同時向開發者展示了C#語言的2.0版本。2005年4月,微軟發布了Visual Studio 2005 Beta2,這已經是具備了幾乎全部功能的VisualStudio,包括的產品有sql server2005、Team Foundation Server和TeamSuite。這時的C#編譯器已經能夠處理C# 2.0中所有的新特性。
C# 2.0為開發者帶來的最主要的特性就是泛型編程能力。和面向對象思想一樣,泛型思想也是一種已經成熟的編程思想,但依然是沒有哪一種主流開發語言能夠支持完備的泛型概念。這主要是因為泛型的概念在一定程度上對面向對象概念進行衝擊,同時,由於在編譯期間對類型參數的完全檢測很難做到,很多問題會被遺留到運行時。C# 2.0別出心裁,對泛型類型參數提出了“約束”的新概念,並以優雅的語法體現在語言之中。有了約束,結合編譯器強大的類型推斷能力,可以在編譯時發現幾乎所有“危險”的泛型套用。C# 2.0的另一個突出的特性就是匿名方法,用來取代一些短小的並且僅出現一次的委託,使得語言結構更加緊湊。匿名方法除了可以使得事件處理器的編寫更加精簡以外,還將開發者帶入了程式設計的一個新的領域——函式式編程,曾經有高人就用匿名方法結合泛型編程實現了函式式編程中的重要結構—— Lambda 表達式。儘管這種實現顯得很繁瑣而且不易理解,但畢竟是實現了。最終,函式式編程還是被引入到了C#語言中,這將在下一節中為大家講述。
此外,C# 2.0還進一步增強了語言的表達能力。在C# 2.0中,屬性語法中的get和set訪問器可以擁有不同的許可權,這就使得定義一個在庫的內部可讀寫,而在庫的外部唯讀的屬性成為可能。同時,C# 2.0還提供了疊代器的概念,這使得一個類無需實現IEnumerator 和IEnumerable接口即可實現一個可以進行遍歷的類型,並且無需在類型中維護疊代狀態。此時的.NET已經得到了很廣泛的認可,並且因為元數據為組件帶來了強大的自我描述能力,許多程式庫廠商被吸引到.NET平台上來。隨著.NET程式庫數量的增長,逐漸暴露了命名的問題。在面向對象技術廣泛發展後,人們就意識到名字的管理問題,因此幾乎所有的面向對象語言都提出了“命名空間”的概念.而在C# 1.x時代,這個問題再一次出現。如果一個庫廠商XX 希望以XX.System來命名他們自己的系統基礎庫,那么當開發者使用using System語句時就會產生歧義。為此。C# 2.0中提供了global關鍵字,這為.NET庫中所有的命名空間提供了一個“根”,通過指定global::System和global::XX.System就可以區別兩個庫了。這一時期的C#編譯器變得非常複雜,泛型的引入使得編譯器不得不具備超強的類型推斷能力。同時,疊代器的思想並非是在CLI層面上實現的,而是由編譯器自動生成了實現I E n u m e r a t o r 和IEnumerable接口類型。在經歷了一系列的改進和完善後,微軟決定於2005年11月發布Visual Studio2005,該開發環境將正式支持C#2.0。由於此推出了數個預覽版和測試版,大家的期待之情似乎已經不是那么強烈了。
C#3.0(研發代號“Orcas”——魔鬼)
2005年9 月份的PDC大會則為開發者們帶來了另外的驚喜——C#3.0(研發代號“Orcas”——魔鬼)的技術預覽版。說到C# 3.0,就不得不提一下微軟的LINQ 項目,LINQ(語言集成查詢,Language Integrated Query)提出了一種通過面向對象語法來實現對非面向對象數據源的查詢技術,可查詢的數據源從關係型資料庫延伸到一般意義上的集合(如數組和列表)以及XML。而C# 3.0則是率先實現了LINQ的語言。
在C# 3.0中,我們可以用類似於SQL語句的語法從一個數據源中輕鬆地得到滿足一定條件的對象集合。例如要查找一個字元串數組names中所有長度大於5的字元串,就可以寫:
var longname = from n in names wheren.Length > 5 select n;
這樣我們就得到一個新的字元數組longname,其中包含了我們所需要的結果。這種語句稱作查詢語句,與SQL語句唯一的區別是C#中的查詢語句往往把select子句放到最後(這反而倒有些類似於中文的閱讀順序了)。初次看到這樣一個語句,我們可能會有很大疑問:這還是C#語言嗎?這的確是合乎語法規則的C#代碼,而且編譯器可以識別這種語法。然而實際上,C#編譯器並不會對這種語法進行實際的的編譯,而是將其翻譯為正常的方法調用:
var longname = names.Where(n => n.Length > 5).Select(n);
然後再進行進一步的編譯。在上面的例子中已經說明,names是一個存放有字元串的數組,而數組類型並沒有Where的方法。的確,Where並非names的成員方法,微軟也沒有對數組類型進行任何改動。這是C# 3.0中另外一個重要的新特性:擴展方法。擴展方法是定義在其他靜態類中的靜態方法,其第一個參數的類型就是希望擴展的類型,並且這個參數被冠以this修飾符。擴展方法是靜態的,但可以像調用被擴展類型的實例方法那樣進行調用,看起來好像是被擴展類型自己的方法一樣。這就為語言帶來了很大的靈活性,我們可以將一組近似的功能如上面的Where 和Select等(這在LINQ中被稱作“標準查詢表達式”)定義在一個外部類中,這樣既無須修改現有類型,又可以將功能組織在一起。當然,為了做到面向對象的封裝性,擴展方法只能在被擴展類型的公共成員上進行操作,如果需要從內部對類型進行改進,就必須改變現有類型的代碼。在Where方法的參數列表里,我們又發現了一種奇怪的語法:n => n.Length > 5。這就是我們上文提到過的Lambda 表達式。
微軟的官方規範中稱,Lambda 表達式是匿名方法的一種自然進化。因此Lambda 表達式其實也是一種特殊的委託,由編譯器負責生成一個匿名的委託類型,它接受一個字元串類型的參數n;返回值為布爾類型,表示n的長度是否大於5;其中的參數類型和返回值類型都是由編譯器推斷而來的。說到類型推斷,還要解釋的一點就是上面的語句中出現的新關鍵字var。從出現的位置來看,var應該是一個類型。然而這又不是一個C#內建類型,也不是CLI提出的新類型;它只是一個“占位符”,它的確表示一個類型,但具體是什麼類型需要編譯器在編譯期間進行推斷。Lamda表達式的真正意義不僅僅在於簡化了委託的編寫方式,更重要的是它把代碼表達式體現為了數據。換句話說,Lambda表達式不僅可以被編譯為一段可以執行的代碼(類似於匿名方法),也可以將其翻譯為一個數據結構——表達式樹。而如何處理Lambda 表達式,是由編譯器根據Lambda表達式的使用方式來自動確定的。當把一個Lambda表達式賦給一個具有委託類型的域、屬性或變數時,編譯器像編譯匿名方法一樣將表達式體翻譯成一段可執行代碼;而當把一個L a m b d a 表達式賦給一個具有Expression類型的域、屬性或變數時,編譯器就會將Lambda表達式解析為一個表達式樹。對於翻譯為代碼的Lambda,可以向調用委託那樣進行調用,而對於翻譯為表達式樹的Lambda表達式,就不可以了,會得到一個編譯錯誤。但表達式樹存在於一個由編譯器生成的數據結構中,因此可以在運行時對其進行分析甚至修改。
除了上面提到的一些重大改進之外,C# 3.0也對細微的語法進行了一些改進,使C#語言變得更加優雅和全面。值得說明的是,C# 3.0經過編譯後生成的IL代碼,完全是基於.NET 2.0的,C#語言已經遠遠跑在了他所棲生的平台前面。這一時期的C#語言離CLI已經越來越遠了,編譯器的工作也愈加繁重起來。首先很多語言結構(如查詢表達式和Lambda 表達式)都不是CLI中提供的特性,因此需要編譯器進行大量的轉譯工作;其次是這些語言結構帶來的大量類型推斷任務,也都是靠編譯器來完成的。C#走到了3.0以後,已經完全不再是當年那個“簡單”的語言了。它的開發者稱其為“魔鬼”,而琳琅滿目的新特性也的確讓開發者們眼花繚亂,甚至感到恐懼。語言集成查詢的引入,使得前一段時期內為開發者們廣泛討論的ORM概念得到了更加深入地體現,尤其是它所支持的數據源之廣泛,讓ORM理念變得已經不再必要了;而一些“.NET中的ORM實現”,似乎也成了完全不必要的擴展項目了。Lambda 表達式的引入,使得C#將可以輕鬆地完成特定領域(Domain-Specific)的開發。
一個成功的開發人員在面對新鮮事物和新的困難時,興奮是遠大於恐懼的。讓魔鬼來得更猛烈些吧!
[編輯本段]C#關鍵字完整列表
abstract
as
base
bool
break
byte
case
catch
char
checked
class
const
continue
decimal
default
delegate
do
double
else
enum
ecent
explicit
extern
false
finally
fixed
float
for
foreach
get
goto
if
implicit
in
int
interface
internal
is
lock
long
namespace
new
null
object
out
override
partial
private
protected
public
readonly
ref
return
sbyte
sealed
set
short
sizeof
stackalloc
static
struct
switch
this
throw
true
try
typeof
uint
ulong
unchecked
unsafe
ushort
using
value
virtual
volatile
volatile
void
where
while
yield
其中有幾個比較容易弄錯的
關鍵字 描 述
abstract 可以和類、方法、屬性、索引器及事件一起使用,
標識一個可以擴展但不能被實體化的、必須被實現的類或方法。
as 一個轉換操作符,如果轉換失敗,就返回null。
base 用於訪問被派生類或構造中的同名成員隱藏的基類成員。
catch 定義一個代碼塊,在特定類型異常拋出時,執行塊內代碼。
參見try和finally。
checked 既是操作符又是語句。
確保編譯器運行時,檢查整數類型操作或轉換時出現的溢出。
const 標識一個可在編譯時計算出來的變數值,即一經指派不可修改的值。
delegate 指定一個聲明為一種委託類型。委託把方法封裝為可調用實體,
能在委託實體中調用。
enum 表示一個已命名常量群集的值類型。
event 允許一個類或對象提供通知的成員,他必須是委託類型。
explicit 一個定義用戶自定義轉換操作符的操作符,
通常用來將內建類型轉換為用戶定義類型或反向操作。
必須再轉換時調用顯示轉換操作符。
extern 標識一個將在外部(通常不是c#語言)實現的方法。
finally 定義一個代碼塊,在程式控制離開try代碼快後執行。參見try和catch。
fixed 在一個代碼塊執行時,在固定記憶體位置為一個變數指派一個指針。
foreach 用於遍歷一個群集的元素。
goto 一個跳轉語句,將程式執行重定向到一個標籤語句。
implicit 一個操作符,定義一個用戶定義的轉換操作符。
通常用來將預定義類型轉換為用戶定義類型或反向操作。
隱式轉換操作符必須在轉換時使用。
interface 將一個聲明指定為接口類型,即實現類或構造必須遵循的契約。
internal 一個訪問修飾符。
namespace 定義一個邏輯組的類型和命名空間。
operator 用來聲明或多載一個操作符。
out 標識一個參數值會受影響的參數,但在傳入方法時,
該參數無需先初始化。
params 聲明一個參數數組。如果使用,必須修改指定的最後一個參數。
允許可選參數。
readonly 標識一個變數的值在初始化後不可修改。
ref 標識一個參數值可能會受影響的參數。
sealed 防止類型被派生,防止方法和property被覆載。
sizeof 一個操作符,以byte為單位返回一個值類型的長度。
stackalloc 返回在堆上分配的一個記憶體塊的指針。
struct struct是一種值類型,可以聲明常量、欄位、方法、property、
索引器、操作符、構造器和內嵌類型。
throw 拋出一個異常。
try 異常處理代碼塊的組成部分之一。try代碼塊包括可能會
拋出異常的代碼。參閱catch和finally關鍵字。
typeof 一個操作符,返回傳入參數的類型。
unchecked 禁止溢出檢查。
unsafe 標註包含指針操作的代碼塊、方法或類。
using 當用於命名空間時,using關鍵字允許訪問該命名空間中的類型,
而無需指定其全名。也用於定義finalization操作的範圍。
virtual 一個方法修飾符,標識可被覆載的方法。
volatile 標識一個可被作業系統、某些硬體設備或並發執行緒修改的attribute。
[編輯本段]微軟MSDN提供C#全系列課程
C# 3.0 銳利體驗系列課程(1):概覽
C# 3.0 銳利體驗系列課程(2):Lambda表達式
C# 3.0 銳利體驗系列課程(3):查詢表達式LINQ(1)
C# 3.0 銳利體驗系列課程(4):查詢表達式LINQ(2)
C# 3.0 銳利體驗系列課程(5):查詢表達式LINQ(3)
C#2.0 銳利體驗系列課程(1):泛型編程
C#2.0 銳利體驗系列課程(2):匿名方法、疊代器
C#2.0 銳利體驗系列課程(3):局部類型、空屬類型、靜態類
C#2.0 銳利體驗系列課程(4):雜項技術,以及C#語言的未來發展
C#面向對象設計模式縱橫談(1):面向對象設計模式與原則
C#面向對象設計模式縱橫談(2):Singleton 單件(創建型模式)
C#面向對象設計模式縱橫談(3):Abstract Factory 抽象工廠模式(創建型模式)
C#面向對象設計模式縱橫談(4):Builder 生成器模式(創建型模式)
C#面向對象設計模式縱橫談(5):Factory Method 工廠方法模式(創建型模式)
C#面向對象設計模式縱橫談(6):Prototype 原型模式(創建型模式)
C#面向對象設計模式縱橫談(7):Adapter 適配器模式(結構型模式)
C#面向對象設計模式縱橫談(8):Bridge 橋接模式(結構型模式)
C#面向對象設計模式縱橫談(9):Composite 組合模式(結構型模式)
C#面向對象設計模式縱橫談(10):decorator 裝飾模式(結構型模式)
C#面向對象設計模式縱橫談(11):Facade 外觀模式(結構型模式)
C#面向對象設計模式縱橫談(12):flyweight 享元模式(結構型模式)
C#面向對象設計模式縱橫談(13):Proxy 代理模式(結構型模式)
C#面向對象設計模式縱橫談(14):Chain of Responsibility 職責鏈模式(行為型模式)
C#面向對象設計模式縱橫談(15):(行為型模式) Command 命令模式
C#面向對象設計模式縱橫談(16):(行為型模式) Interpreter 解釋器模式
C#面向對象設計模式縱橫談(17):(行為型模式) mediator 中介者模式
C#面向對象設計模式縱橫談(18):(行為型模式) Iterator 疊代器模式
C#面向對象設計模式縱橫談(19):(行為型模式) Observer 觀察者模式
C#面向對象設計模式縱橫談(20):(行為型模式) Chain Of Responsibility 職責鏈模式
C#面向對象設計模式縱橫談(21):(行為型模式) memento備忘錄模式
C#面向對象設計模式縱橫談(22):(行為型模式) State 狀態模式
C#面向對象設計模式縱橫談(23):(行為型模式) Strategy 策略模式
C#面向對象設計模式縱橫談(24):(行為型模式) Visitor 訪問者模式
C#面向對象設計模式縱橫談(25):設計模式總結
DIY Starter Kit系列(1):21點遊戲講解Card Game Starter Kit
DIY Starter Kit系列(2):Movie Collection Starter Kit
跟我一起學Visual Studio 2008系列課程(1):C# 3.0 新增功能介紹(上)
跟我一起學Visual Studio 2008系列課程(2):C# 3.0 新增功能介紹(下)
跟我一起學Visual Studio 2008系列課程(3):語言集成查詢(LINQ)之入門篇
跟我一起學Visual Studio 2008系列課程(4):語言集成查詢(LINQ)之LINQ to Objects
跟我一起學Visual Studio 2008系列課程(5):語言集成查詢(LINQ)之LINQ to DataSet
跟我一起學Visual Studio 2008系列課程(6):語言集成查詢(LINQ)之LINQ to SQL
跟我一起學Visual Studio 2008系列課程(7):語言集成查詢(LINQ)之LINQ to XML入門篇
跟我一起學Visual Studio 2008系列課程(8):語言集成查詢(LINQ)之LINQ to XML高級篇
跟我一起學Visual Studio 2008系列課程(9):認識VS 2008 IDE針對ASP.NET所做的增強與改進
跟我一起學Visual Studio 2008系列課程(10):ASP.NET增強功能介紹
跟我一起學Visual Studio 2008系列課程(11):認識 IIS 7.0
跟我一起學Visual Studio 2008系列課程(12):VSTO新功能一覽
跟我一起學Visual Studio 2008系列課程(13):STO之利用Outlook對象模型自定義Outlook
跟我一起學Visual Studio 2008系列課程(14):VS2008數據訪問概述
跟我一起學Visual Studio 2008系列課程(15):全面剖析TableAdapter
視頻遊戲開發系列課程(1):遊戲開發過程預覽
視頻遊戲開發系列課程(2):基礎編程概念及C#簡介
視頻遊戲開發系列課程(3):遊戲元素大觀園
視頻遊戲開發系列課程(4):介紹遊戲中的“精靈”和“動畫”
視頻遊戲開發系列課程(5):Transformation and Collision of Sprites
視頻遊戲開發系列課程(6):控制小精靈行為
視頻遊戲開發系列課程(7):讓你的遊戲更“聲”動——音樂和音效
視頻遊戲開發系列課程(8):開始創造遊戲的“精靈”的行為
Modern C#系列課程(3):現代面向對象的程式設計
Modern C#系列課程(4):C# 中的類的設計
Modern C#系列課程(5):C# 中的異常處理
Modern C#系列課程(6):使用WinForms進行GUI設計
Modern C#系列課程(7):ADO.NET進行資料庫編程
Modern C#系列課程(8):多層結構應用程式設計
Modern C#系列課程(9):基於組件的程式設計
Modern C#系列課程(10):C# 中的一些設計技巧
Modern C#(11):深入“委託和事件”
[編輯本段]C#與C++、JAVA的區別
C#(讀做 "C sharp")是微軟公司在去年六月發布的一種新的程式語言,並定於在微軟職業開發者論壇(PDC)上登台亮相.C#是微軟公司研究員Anders Hejlsberg的最新成果.C#看起來與Java有著驚人的相似;它包括了諸如單一繼承,界面,與Java幾乎同樣的語法,和編譯成中間代碼再運行的過程.但是C#與Java有著明顯的不同,它借鑑了Delphi的一個特點,與COM(組件對象模型)是直接集成的,而且它是微軟公司.NET windows網路框架的主角.
微軟c#語言定義主要是從C和C++繼承而來的,而且語言中的許多元素也反映了這一點.C#在設計者從C++繼承的可選選項方面比Java要廣泛一些(比如說Structs),它還增加了自己新的特點(比方說原始碼版本定義).但它還太不成熟,不可能擠垮Java.C#還需要進化成一種開發者能夠接受和採用的語言.而微軟當前為它的這種新語言大造聲勢也是值得注意的.目前大家的反應是:"這是對Java的反擊."
C#更象Java一些,雖然微軟在這個問題上保持沉默.這也是意料中的事情,我覺得,因為Java近來很成功而使用Java的公司都報告說它們在生產效率上比C++獲得了提高.
Java所帶來的巨大影響和大家對它的廣泛接受已經由工作於這種語言和平台之上的程式設計師數量明顯的說明了(估計世界範圍內共有兩百五十萬程式設計師使用Java).由這種語言寫成的應用程式的數量是令人驚訝的並已經滲透了每一個級別的計算,包括無線計算和行動電話(比如日本發明的Java電話).C#能夠在用戶領域獲得這樣的禮遇嗎?我們必須等待並觀望,就象已經由SSI公司的CEO和主席Kalpathi S. Suresh指出來的那樣,"我發現所有這些都是漸進的.如果C#不存在,我們總能回到Java或C和C++.這些都不完全是新技術;它們在更大的意義上來說只是大公司製造的市場噱頭.我們必須給他們時間安頓下來看看這些是不是真的對IT工業有什麼影響."
C++,這個詞在中國大陸的程式設計師圈子中通常被讀做“c加加”,而西方的程式設計師通常讀做“C plus plus”,它是一種使用非常廣泛的計算機程式語言。C++是一種靜態數據類型檢查的,支持多重編程範式的通用程式設計語言。它支持過程式程式設計、數據抽象、面向對象程式設計、泛型程式設計等多種程式設計風格。
貝爾實驗室的本賈尼·史特勞斯特盧普(w:en:Bjarne Stroustrup)博士在20世紀80年代發明並實現了C++(最初這種語言被稱作“C with Classes”)。一開始C++是作為C語言的增強版出現的,從給C語言增加類開始,不斷的增加新特性。虛函式(virtual function)、運算符重載(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、名字空間(name space)逐漸被加入標準。1998年國際標準組織(ISO)頒布了C++程式設計語言的國際標準ISO/IEC 14882-1998。遺憾的是,由於C++語言過於複雜,以及他經歷了長年的演變,直到現在(2004年)只有少數幾個編譯器完全符合這個標準。
另外,就目前學習C++而言,可以認為他是一門獨立的語言;他並不依賴C語言,我們可以完全不學C語言,而直接學習C++。根據《C++編程思想》(Thinking in C++)一書所評述的,C++與C的效率往往相差在正負5%之間。所以有人認為在大多數場合C++ 完全可以取代C語言。
C++語言發展大概可以分為三個階段:第一階段從80年代到1995年。這一階段C++語言基本上是傳統類型上的面向對象語言,並且憑藉著接近C語言的效率,在工業界使用的開發語言中占據了相當大份額;第二階段從1995年到2000年,這一階段由於標準模板庫(STL)和後來的Boost等程式庫的出現,泛型程式設計在C++中占據了越來越多的比重性。當然,同時由於Java、C#等語言的出現和硬體價格的大規模下降,C++受到了一定的衝擊;第三階段從2000年至今,由於以Loki、MPL等程式庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程式設計語言中最複雜的一員。
[編輯本段]C#的前途如何?
這世界上沒有什麼比編程工具更加牽動程式設計師的心。VC、VB、DELPHI、JAVA……這些耀眼的名字不僅占據了程式設計師的生活,而且似乎已經成為了某種信仰。可是,伴隨著新世紀的腳步,這些信仰又一次遭遇了重大的挑戰。微軟,這頭被法官和黑客們折騰得既疲憊又惱怒的獅子,發誓要保住它頭上的王冠,拼盡全力,拿出了看家的本事——.NET戰略。作為 .NET的核心開發語言,C# 順理成章地浮出了水面。程式設計師們也就不得不做出一個痛苦的選擇,跟在誰的後面?要找出答案就不得不作一番比較和預測。筆者作為一個資深的程式設計師,斗膽在此狂言,權作拋磚引玉。
如果拋開一切非技術方面的因素,C# 無疑是這個星球上有史以來最好的程式語言,它幾乎集中了所有關於軟體開發和軟體工程研究的最新成果。面向對象、類型安全、組件技術、自動記憶體管理、跨平台異常處理、版本控制、代碼安全管理……你不可能在另外的一種語言中找到所有這些特性。儘管像很多人注意到的一樣,當我羅列上述特性時,總是讓人想到JAVA,然而C# 確實走得更遠。但現實的情況是,非技術的因素往往更能決定一個產品的未來,尤其在計算機軟體的歷史上,技術卓越的產品,如OS/2、Mac OS、UNIX等,都敗在了Windows那漂亮的臉蛋兒下。而這一次,微軟的角色好像從一個赤手空拳的革命者變成了仗勢欺人的老地主,如果真是要變天,那C# 這孩子豈不是投錯了胎?可能情形並非如此糟糕,畢竟瘦死的駱駝比馬大,而且C# 已經提交給了一個標準化組織,一旦成了國際標準,說不準真有哪個手癢的大俠(也有可能是微軟自己)給移植到Linux 和別的平台上。那樣的話,JAVA可就慘了。因為JAVA的用戶主要是網路服務的開發者和嵌入式設備軟體的開發者,嵌入式設備軟體不是C# 的用武之地,而在網路服務方面,C# 的即時編譯和本地代碼Cache方案比JAVA虛擬機具有絕對的性能優勢。何況C# 一旦成為一個像C++ 一樣的公共的標準,軟體開發商既可以省去JAVA的許可證費用,也不必擔心成為微軟的奴隸,那些反微軟的人士和主張廠商獨立的人士可能也不會有什麼意見。這可能正是微軟所期待的。
如果把C# 和 JAVA 在網路服務領域的爭奪比作未來制空權的爭奪的話,那么C# 和傳統通用快速開發工具——VB、DELPHI等的較量將是地地道道的白刃戰。可能最慘的程式設計師就是VB程式設計師,在微軟,VB就像離任的柯林頓,不但失去了所有的光輝,而且亂事纏身。想想吧,VB6寫的項目必須用轉換工具轉換成基於.NET的代碼才能在VB7中調入,幾乎面目全非。由於VB7遵循為迎合.NET而建立的通用語言規範(CLS),幾乎把所有原來只在C++、JAVA等語言中可以運用的特性統統加了進來,只是語法和原來兼容。如果你是第一次在VB7中看到自己的舊VB6項目轉換之後的代碼,一定要當心你的心臟!所以,努力吧,別告訴我你將就此退休。DELPHI的狀況也好不到哪裡去,原來的看家本領是做起套用來又快又好,可現在看看最新的VS.NET Beta 1, 你會感到如此熟悉,眾多的屬性列表、組件……誰讓你窮呢,連總設計師都養不住。
其實在程式語言中真正的霸主多年來一直是C++,所有的作業系統和絕大多數的商品軟體都是用C++作為主要開發語言的。JAVA的程式設計師絕大多數也是C++的愛好者,PHP的成功裡面也有類似C++的語法的功勞。在作業系統、設備驅動程式、視頻遊戲等領域,C++在很長的時間內仍將占據主要地位,而在數量最大的套用軟體的開發上,C# 很可能取代C++的位置。首先,C# 和JAVA一樣,簡直就是照搬了C++的部分語法,因此,對於數量眾多的C++程式設計師學習起來很容易上手,另外,對於新手來說,比C++要簡單一些。其次,Windows是目前占壟斷地位的平台,而開發Windows套用,當然微軟的聲音是不能忽略的。最重要的是,相對於C++,用C# 開發套用軟體可以大大縮短開發周期,同時可以利用原來除用戶界面代碼之外的C++代碼。
但是,C# 也有弱點。首先,在一些版本較舊的Windows平台上,C# 的程式還不能運行,因為C# 程式需要 .NET運行庫作為基礎,而 .NET運行庫作為現在的的Windows(XP及以後版本)的一部分發行, Windows Me 和 Windows 2000用戶只能以Service Pack的形式安裝使用。其次,C# 能夠使用的組件或庫還只有 .NET 運行庫等很少的選擇,沒有豐富的第三方軟體庫可用,這需要有一個過程,同時各軟體開發商的支持也很重要。第三,JAVA的成功因素里有一些是反微軟陣營的吹捧,雖然“只寫一次,到處運行”只是一句口號,但畢竟已經是一種成熟的技術。而C# 的鼓吹者目前只有名聲不佳的微軟,且只能運行在Windows上。實際上這兩種語言都不是不可替代的,理智的說,對軟體開發商而言,什麼用的最熟什麼就是最好的工具。尤其對C++的使用者,C# 沒有帶來任何新東西,因為.NET運行庫在C++中也可以使用,沒有要換的絕對的理由。
綜上所述,我個人認為,近幾年,C# 將不可避免地崛起,在Windows平台上成為主角,而JAVA將在UNIX、Linux等平台上成為霸主,C++ 將繼續在系統軟體領域大展拳腳。非常有意思的是,這些語言的語法極其接近,因為JAVA和C# 都是由C++發展而來的。其他的開發工具當然還會在相當長的時間裡繼續他們的旅程,不過在市場份額上,將不可避免地受到衝擊。