C#(讀作“C Sharp”),C# 是面向?qū)ο蟮?、面向組件的編程語言。
C#在2000年6月發(fā)布,使用了.NET框架作為運(yùn)行環(huán)境,源于C語言系列,繼承了C和C++強(qiáng)大功能的同時去掉了一些它們的復(fù)雜特性(例如,沒有宏以及不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運(yùn)行效率,以其強(qiáng)大的操作能力、優(yōu)雅的語法風(fēng)格、創(chuàng)新的語言特性和便捷的面向組件編程的支持成為.NET開發(fā)的首選語言[1]。是由C和C++衍生出來的一種安全的、穩(wěn)定的、簡單的、優(yōu)雅的面向?qū)ο缶幊陶Z言。
C#主要應(yīng)用于桌面應(yīng)用程序開發(fā)、Web應(yīng)用程序開發(fā)、移動應(yīng)用程序開發(fā)、游戲開發(fā)、云和服務(wù)開發(fā)、數(shù)據(jù)庫開發(fā)、科學(xué)計(jì)算、物聯(lián)網(wǎng)(IoT)應(yīng)用程序、人工智能(AI)應(yīng)用程序等。
概述
C#是由微軟公司發(fā)布的一種由C和C++衍生出來的面向?qū)ο蟮木幊陶Z言、運(yùn)行于.NET Framework和.NET Core(完全開源,跨平臺)之上的高級程序設(shè)計(jì)語言2。
歷史發(fā)展
C#是微軟公司在2000年6月發(fā)布的一種新的編程語言,主要由安德斯·海爾斯伯格(Anders Hejlsberg1 )主持開發(fā),它是第一個面向組件的編程語言,其源碼會編譯成msil再運(yùn)行。它借鑒了Delphi的特點(diǎn),與COM(組件對象模型)是直接集成的,并且新增了許多功能及語法,而且它是微軟公司.NET windows網(wǎng)絡(luò)框架的主角3。
C#最初有個更酷的名字,叫做COOL。微軟從1998年12月開始了COOL項(xiàng)目,直到2000年2月,COOL被正式更名為C#。在1998年,Delphi語言的設(shè)計(jì)者安德斯·海爾斯伯格帶領(lǐng)著Microsoft公司的開發(fā)團(tuán)隊(duì),開始了第一個版本C#語言的設(shè)計(jì)。在2000年9月,國際信息和通信系統(tǒng)標(biāo)準(zhǔn)化組織為C#語言定義了一個Microsoft公司建議的標(biāo)準(zhǔn)。最終C#語言在2001年得以正式發(fā)布。
原Borland公司的首席研發(fā)設(shè)計(jì)師安德斯·海爾斯伯格在微軟開發(fā)了VisualJ++ 1.0,很快Visual J++由1.1版本升級到6.0版。SUN公司認(rèn)為Visual J++ 違反了Java開發(fā)平臺的中立性,對微軟提出了訴訟。2000年6月26日微軟在奧蘭多舉行的“職業(yè)開發(fā)人員技術(shù)大會”(PDC2000)上,發(fā)表新的語言C#。C#語言取代了Visual J++,語言本身深受 Java、C 和 C++ 的影響4。
設(shè)計(jì)目標(biāo)
C#旨在設(shè)計(jì)成為一種“簡單、現(xiàn)代、通用”,以及面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。下面是 C# 的主要設(shè)計(jì)目標(biāo):
簡單易用:C# 的設(shè)計(jì)目標(biāo)之一是提供一種簡單易用的語言,使開發(fā)人員能夠快速上手并編寫清晰明了的代碼。它采用類似于其他流行編程語言的語法和概念,提供直觀的語言特性和一致的編程模型。
類型安全和內(nèi)存安全:C# 在設(shè)計(jì)上強(qiáng)調(diào)類型安全和內(nèi)存安全。它具有靜態(tài)類型檢查和類型推斷機(jī)制,可以在編譯時捕獲大部分類型錯誤。此外,C# 在運(yùn)行時使用垃圾回收器(Garbage Collector)來自動管理內(nèi)存,減少了開發(fā)人員需要手動管理內(nèi)存的工作量。
面向?qū)ο螅篊# 是一種面向?qū)ο蟮木幊陶Z言,支持封裝、繼承和多態(tài)等面向?qū)ο蟮母拍睢Mㄟ^類、接口和繼承等機(jī)制,開發(fā)人員可以組織和抽象代碼,提高代碼的可維護(hù)性和可重用性。
可擴(kuò)展性:C# 的設(shè)計(jì)目標(biāo)是支持可擴(kuò)展的編程模型。它提供了豐富的庫和框架,使開發(fā)人員能夠構(gòu)建復(fù)雜的應(yīng)用程序,并輕松集成第三方庫和組件。C# 還支持?jǐn)U展方法、屬性和索引器等特性,使開發(fā)人員能夠擴(kuò)展現(xiàn)有類型的功能。
跨平臺:C# 的設(shè)計(jì)目標(biāo)是實(shí)現(xiàn)跨平臺開發(fā)。通過 .NET Core 平臺,C# 應(yīng)用程序可以在多個操作系統(tǒng)上運(yùn)行,如 Windows、Linux 和 macOS。這使得開發(fā)人員能夠在不同的平臺上共享代碼和邏輯,提高開發(fā)效率和代碼重用性。
集成開發(fā)環(huán)境(IDE)支持:C# 的設(shè)計(jì)目標(biāo)之一是與集成開發(fā)環(huán)境(如 Visual Studio)緊密集成。Visual Studio 提供了強(qiáng)大的工具和功能,使開發(fā)人員能夠輕松編寫、調(diào)試和部署 C# 應(yīng)用程序。
C#語言及其特點(diǎn)
C#是的一種編程語言,具有以下突出的特點(diǎn)2:
(1)語法簡潔:不允許直接操作內(nèi)存,去掉了指針操作。
(2)徹底的面向?qū)ο笤O(shè)計(jì):C#具有面向?qū)ο笳Z言所應(yīng)有的一切特性:封裝、繼承和多態(tài)。
(3)與Web緊密結(jié)合:C#支持絕大多數(shù)的Web 標(biāo)準(zhǔn),如 HTML、XML、SOAP 等。
(4)強(qiáng)大的安全性機(jī)制:可以消除軟件開發(fā)中常見的錯誤(如語法錯誤),.NET提供的垃圾回收器能夠幫助開發(fā)者有效地管理內(nèi)存資源。
(5)兼容性: C#遵循.NET的公共語言規(guī)范(CLS),從而能夠保證與其他語言開發(fā)的組件兼容。
(6)靈活的版本處理技術(shù):C#語言本身內(nèi)置了版本控制功能,因此使開發(fā)人員更加容易地開發(fā)和維護(hù)。
(7)完善的錯誤、異常處理機(jī)制:C#提供了完善的錯誤和異常處理機(jī)制,使程序在交付使用時能夠更加健壯。
程序結(jié)構(gòu)
C#程序結(jié)構(gòu)大體可以分為注釋、命名空間、類、Main方法、關(guān)鍵字、標(biāo)識符和語句2。
注釋
對某行或某段代碼進(jìn)行說明,編譯器編譯程序時不執(zhí)行注釋的代碼或文字,主要功能是方便對代碼的理解與維護(hù)。
注釋可以分為行注釋、塊注釋、文檔注釋三種6。
行注釋
行注釋都以“//”開頭;到行結(jié)束有效。
塊注釋
塊注釋通常以“/*”開始,以“*/”結(jié)束,注釋的內(nèi)容放在它們之間,到遇到第一個結(jié)束分隔符有效。
說明:塊注釋有開始標(biāo)記和結(jié)束標(biāo)記;標(biāo)記對之間的文本會被編譯器忽略;可以跨任意多行,也可以只包括行的一部分。
文檔注釋
文檔注釋以“///”開始。文檔注釋包含XML文本,可以用于產(chǎn)生程序文檔6。
|| || 文檔注釋
如果注釋的行數(shù)較少,一般使用行注釋。對于連續(xù)多行的大段注釋,則使用塊注釋。
注意:
注釋可以出現(xiàn)在代碼的任意位置,但是不能分隔關(guān)鍵字和標(biāo)識符。
不允許嵌套注釋,同一時間只能有一個注釋起作用6。
命名空間
命名空間
命名空間是一種用于組織和管理代碼的機(jī)制。它提供了一種將相關(guān)的類型、類、接口、結(jié)構(gòu)體和其他成員組織在一起的方式。通過創(chuàng)建命名空間,您可以避免命名沖突并提供代碼的可組織性、可重用性和可維護(hù)性1。
命名空間規(guī)則:
在命名空間內(nèi),每個類型名必須有別于所有其他類型。
命名空間內(nèi)的類型稱為命名空間的成員。
一個源文件可以包含任意數(shù)目的命名空間聲明,可以順序也可以嵌套。
命名空間不是封閉的??梢栽谠次募暮竺婊蛄硪粋€源文件中再次聲明。
一個命名空間可以是另一個命名空間的成員。
命名空間名稱
把一組類型分組在一起并給它們一個名稱,稱為命名空間名稱。命名空間名稱應(yīng)該描述命名空間的內(nèi)容并和其他命名空間名稱相區(qū)別6。
命名空間名稱可以是任何有效標(biāo)識符;命名空間名稱可以包括句點(diǎn)符號,用于把類型組織成層次。
類
類
類是一種自定義的數(shù)據(jù)類型,是 C#語言的核心和基本構(gòu)成模塊,包含了一組屬性和方法。屬性用來描述類的特征,方法用來描述類的行為??梢允褂胏lass關(guān)鍵字來定義一個類。
類名
類名是一種標(biāo)識符,必須符合標(biāo)識符的命名規(guī)則。類名要能夠體現(xiàn)類的含義和用途。類名一般采用第一個字母大寫的名詞,也可以采用多個詞構(gòu)成的組合詞2。
Main方法
Main 方法是程序的入口點(diǎn),C#程序中必須包含一個Main 方法,在該方法中可以創(chuàng)建對象和調(diào)用其他方法,一個 C#程序中只能有一個Main 方法,并且在 C#中所有的Main 方法都必須是靜態(tài)的2。
可以用3個修飾符修飾Main 方法,分別是 public、static 和 void。
public:說明 Main 方法是共有的,在類的外面也可以調(diào)用整個方法。
static:說明方法是一個靜態(tài)方法,即這個方法屬于類的本身,而不是這個類的特定對象。調(diào)用靜態(tài)方法不能使用類的實(shí)例化對象,必須直接使用類名來調(diào)用。
void:此修飾符說明方法無返回值2。
關(guān)鍵字
關(guān)鍵字是指在 C#語言中具有特殊意義的單詞,它們被 C#設(shè)定為保留字,不能隨意使用。在 C# 中,有些關(guān)鍵字在代碼的上下文中有特殊的意義,如 get 和 set,這些被稱為上下文關(guān)鍵字(contextual keywords)。下表列出了C# 中常見的保留關(guān)鍵字(Resened kevwords)和下文關(guān)鍵字(Contextual Keywords)7。
|| || 保留關(guān)鍵字
|| || 上下文關(guān)鍵字
常用關(guān)鍵字注釋2:
abstract:可以和類、方法、屬性、索引器及事件一起使用,標(biāo)識一個可以擴(kuò)展但不能被實(shí)體化的、必須被實(shí)現(xiàn)的類或方法。
as:一個轉(zhuǎn)換操作符,如果轉(zhuǎn)換失敗,就返回null。
base:用于訪問被派生類或構(gòu)造中的同名成員隱藏的基類成員。
catch:定義一個代碼塊,在特定類型異常拋出時,執(zhí)行塊內(nèi)代碼。
checked:既是操作符又是語句,確保編譯器運(yùn)行時,檢查整數(shù)類型操作或轉(zhuǎn)換時出現(xiàn)的溢出。
const:標(biāo)識一個可在編譯時計(jì)算出來的變量值,即一經(jīng)指派不可修改的值。
delegate:指定一個聲明為一種委托類型。委托把方法封裝為可調(diào)用實(shí)體,能在委托實(shí)體中調(diào)用。
enum:表示一個已命名常量群集的值類型。
event:允許一個類或?qū)ο筇峁┩ㄖ某蓡T,他必須是委托類型。
explicit:一個定義用戶自定義轉(zhuǎn)換操作符的操作符,通常用來將內(nèi)建類型轉(zhuǎn)換為用戶定義類型或反向操作,必須再轉(zhuǎn)換時調(diào)用顯示轉(zhuǎn)換操作符。
extern:標(biāo)識一個將在外部(通常不是c#語言)實(shí)現(xiàn)的方法。finally:定義一個代碼塊,在程序控制離開try代碼塊后執(zhí)行。參見try和catch。
fixed:在一個代碼塊執(zhí)行時,在固定內(nèi)存位置為一個變量指派一個指針。
foreach:用于遍歷一個群集的元素。
goto:一個跳轉(zhuǎn)語句,將程序執(zhí)行重定向到一個標(biāo)簽語句。
implicit:一個操作符,定義一個用戶定義的轉(zhuǎn)換操作符,通常用來將預(yù)定義類型轉(zhuǎn)換為用戶定義類型或反向操作,隱式轉(zhuǎn)換操作符必須在轉(zhuǎn)換時使用。
interface:將一個聲明指定為接口類型,即實(shí)現(xiàn)類或構(gòu)造必須遵循的合同。
internal:一個訪問修飾符。
namespace:定義一個邏輯組的類型和命名空間。
operator:用來聲明或多載一個操作符。
out:標(biāo)識一個參數(shù)值會受影響的參數(shù),但在傳入方法時,該參數(shù)無需先初始化。
params:聲明一個參數(shù)數(shù)組。如果使用,必須修改指定的最后一個參數(shù),允許可選參數(shù)。
readonly:標(biāo)識一個變量的值在初始化后不可修改。
ref:標(biāo)識一個參數(shù)值可能會受影響的參數(shù)。
sealed:防止類型被派生,防止方法和property被覆載。
sizeof:一個操作符,以byte為單位返回一個值類型的長度。
stackalloc:返回在堆上分配的一個內(nèi)存塊的指針。
struct:是一種值類型,可以聲明常量、字段、方法、property、索引器、操作符、構(gòu)造器和內(nèi)嵌類型。
throw:拋出一個異常。
try:異常處理代碼塊的組成部分之一。try代碼塊包括可能會,拋出異常的代碼。參閱catch和finally關(guān)鍵字。
typeof:一個操作符,返回傳入?yún)?shù)的類型。
unchecked:禁止溢出檢查。unsafe:標(biāo)注包含指針操作的代碼塊、方法或類。
using:當(dāng)用于命名空間時,using關(guān)鍵字允許訪問該命名空間中的類型,而無需指定其全名。也用于定義finalization操作的范圍。
virtual:一個方法修飾符,標(biāo)識可被覆載的方法。
volatile:標(biāo)識一個可被操作系統(tǒng)、某些硬件設(shè)備或并發(fā)線程修改的attribute[8-9]。
標(biāo)識符
標(biāo)識符是指在程序中用來表示事物的單詞。
標(biāo)識符命名規(guī)則:
標(biāo)識符只能由數(shù)字、字母、下劃線和@組成2;
標(biāo)識符不能以數(shù)字開頭;
標(biāo)識符不能是關(guān)鍵字,如果您想使用這些關(guān)鍵字作為標(biāo)識符,可以在關(guān)鍵字前面加上 @ 字符作為前綴;
標(biāo)識符區(qū)分大小寫。大寫字母和小寫字母被認(rèn)為是不同的字母;
不能與C#的類庫名稱相同。7
語句
語句是描述一個類型或告訴程序去執(zhí)行一個動作的源代碼指令,分為簡單語句和塊。
簡單語句
簡單語句以一個分號結(jié)束。
例如,下面的代碼是一個由兩條簡單語句組成的序列。第一條語句定義了一個名稱為var1的變量,并初始化它的值為5。第二條語句打印變量var1的值到屏幕窗口6。
int var1 = 5;
System.Console,WriteLine("The value of var1is {0}",var1);
塊
塊是一個由成對大括號包圍的0條或多條語句序列,它在語法上相當(dāng)于一條語句。
可以使用之前示例中的兩條語句創(chuàng)建一個塊。用大括號把語句包圍起來,如下面的代碼所示6:
{
int var1 = 5;
System.Console.WriteLine("Thevalue of var1 is (0}",var1);
}
注意:
可以在任何語法上只需要一條語句而你需要的行為又要求一條以上的簡單語句的情況下使用塊。
有些特定的程序結(jié)構(gòu)只能使用塊。在這些結(jié)構(gòu)中,不能用簡單語句替代塊。
簡單語句以分號結(jié)束,但塊后面不跟分號。
數(shù)據(jù)類型
值類型
基本數(shù)據(jù)類型:C#擁有比C/C++或者Java更廣泛的數(shù)據(jù)類型。這些類型是bool、byte、sbyte、short、ushort、int、uint、long、ulong、float、double和decimal,所有這些類型像Java一樣都有一個固定的大小,像C和C++一樣,每個數(shù)據(jù)類型都有有符號和無符號兩種類型。與Java相同的是,一個字符變量包含的是一個16位的Unicode字符。
C#新的數(shù)據(jù)類型是decimal數(shù)據(jù)類型,其在 .NET 中被設(shè)計(jì)用來處理高精度的十進(jìn)制數(shù)運(yùn)算。它可以存儲最多28到29位的十進(jìn)制數(shù)字,具體取決于數(shù)字的值。由于其高精度特性,decimal 類型通常用于需要精確計(jì)算的金融和貨幣應(yīng)用,以避免浮點(diǎn)數(shù)運(yùn)算可能產(chǎn)生的舍入誤差。對于貨幣數(shù)據(jù),它能存放28位10進(jìn)制數(shù)字8。
Nullable類型,允許用它定義包含null值(即空值)的數(shù)據(jù)類型,定義一個nullable類型非常類似于定義一個非nullable類型。不同之處在于使用類型修飾符“?”9。
比如定義一個整型如下:int myInt = 1;
要使一個整型變量可以存儲一個null值,可以如下聲明:
int? myNullableInt= 1;
元組 (ValueTuple)類型由一個或多個元素組成,每個元素可以是不同的數(shù)據(jù)類型。定義時需要指定其所有數(shù)據(jù)成員的類型,或者,可以指定字段名稱。
引用類型
Object:所有其他類的基類,string是對象類型的派生類型,共享了Object類型提供的基礎(chǔ)功能。
String:是一個非常核心的類,提供了豐富的方法和屬性來處理文本數(shù)據(jù)。無論何時在程序中寫入一句帶引號的字符串,編譯器會創(chuàng)建一個string對象來保存它8。
Record:是一種用record關(guān)鍵字聲明的新的引用類型,與類不同的是,Record有著引用類型的支持大對象、繼承、多態(tài)等特性,也有著結(jié)構(gòu)的基于值相等的特性。
Delegate: 在C#中,代理(Delegate)是一種特殊的類型,它持有對某個方法的引用。代理允許將方法作為參數(shù)傳遞給其他方法,或者將方法作為反饋(Callback)使用。這使得代理成為一種非常強(qiáng)大的機(jī)制,用于實(shí)現(xiàn)事件處理、反饋(回調(diào))和泛型方法的多態(tài)性。
參數(shù)數(shù)組:提供了一種更加靈活和便捷的方式來處理可變數(shù)量的輸入?yún)?shù)。定義參數(shù)數(shù)組時,數(shù)據(jù)類型前需使用 params修飾符,數(shù)據(jù)類型后放置一組空的方括號10,如:
void ListInts( params int[]inVals )
程序執(zhí)行
C#所開發(fā)的程序源代碼并不是編譯成能夠直接在操作系統(tǒng)上執(zhí)行的二進(jìn)制本地代碼。與Java類似,它被編譯成為中間代碼,然后通過.NETFramework的虛擬機(jī)——被稱之為通用語言運(yùn)行庫(CLR)——執(zhí)行。所有的.Net編程語言都被編譯成這種被稱為MSIL(MicrosoftIntermediate Language )的中間代碼。因此雖然最終的程序在表面上仍然與傳統(tǒng)意義上的可執(zhí)行文件都具有“.exe”的后綴名。但是實(shí)際上,如果計(jì)算機(jī)上沒有安裝.Net Framework,那么這些程序?qū)⒉荒軌虮粓?zhí)行。
在程序執(zhí)行時,.Net Framework將中間代碼翻譯成為二進(jìn)制機(jī)器碼,從而使它得到正確的運(yùn)行。最終的二進(jìn)制代碼被存儲在一個緩沖區(qū)中。所以一旦程序使用了相同的代碼,那么將會調(diào)用緩沖區(qū)中的版本。這樣如果一個.Net程序第二次被運(yùn)行,那么這種翻譯不需要進(jìn)行第二次,速度明顯加快11。
版本介紹
- C# 1.0——純粹的面向?qū)ο?/li>
發(fā)布時間:2002 年 1 月
C# 1.0 的主要功能:類、結(jié)構(gòu)、接口、事件、屬性、委托、運(yùn)算符和表達(dá)式、語句、特性
- C# 1.2
發(fā)布時間:2003 年 4 月
隨 Visual Studio .NET 2003 一起提供的 C# 版本 1.2。它對語言做了一些小改進(jìn)。
從此版本開始,當(dāng) IEnumerator 實(shí)現(xiàn) IDisposable 時,foreach 循環(huán)中生成的代碼會在 IEnumerator 上調(diào)用 Dispose。
這一時期的C#(以下稱為C#1.x)提出了純粹的面向?qū)ο蟾拍?。C++并非純面向?qū)ο蟮模瑸榱撕虲兼容以及提供更高的執(zhí)行效率,它保留了很多模塊化的東西。C#還通過類類型、值類型和接口類型的概念形成了統(tǒng)一的類型系統(tǒng)。
盡管C# 1.x提供了如此多的新鮮概念,但實(shí)際上,這些概念都是由CLI提出的。因此當(dāng)將一個C#源程序編譯為可執(zhí)行文件時,編譯器做的工作相對而言并不多。需要編譯器代勞的是要將一個簡單的委托定義語句翻譯為一個繼承System.MulticastDelegate類型定義。
- C# 2.0——泛型編程新概念
發(fā)布時間:2005 年 11 月
C# 2.0的主要功能:泛型、分部類型、匿名方法、可以為 null 的值類型、迭代器、協(xié)變和逆變。
微軟在2004年的6月份發(fā)布了Visual Studio2005的第一個Beta 版,同時向開發(fā)者展示了C#語言的2.0版本。2005年4月,微軟發(fā)布了Visual Studio2005 Beta2,這已經(jīng)是具備了幾乎全部功能的VisualStudio,包括的產(chǎn)品有SQL Server2005、TeamFoundation Server和TeamSuite。這時的C#編譯器已經(jīng)能夠處理C#2.0中所有的新特性12。
C# 2.0為開發(fā)者帶來的最主要的特性就是泛型編程能力。和面向?qū)ο笏枷胍粯?,泛型思想也是一種已經(jīng)成熟的編程思想,但依然是沒有哪一種主流開發(fā)語言能夠支持完備的泛型概念。這主要是因?yàn)榉盒偷母拍钤谝欢ǔ潭壬蠈γ嫦驅(qū)ο蟾拍钸M(jìn)行沖擊,同時,由于在編譯期間對類型參數(shù)的完全檢測很難做到,很多問題會被遺留到運(yùn)行時。C# 2.0別出心裁,對泛型類型參數(shù)提出了“約束”的新概念,并以優(yōu)雅的語法體現(xiàn)在語言之中。有了約束,結(jié)合編譯器強(qiáng)大的類型推斷能力,可以在編譯時發(fā)現(xiàn)幾乎所有“危險(xiǎn)”的泛型應(yīng)用。18
C# 2.0的另一個突出的特性就是匿名方法,用來取代一些短小的并且僅出現(xiàn)一次的委托,使得語言結(jié)構(gòu)更加緊湊。匿名方法除了可以使得事件處理器的編寫更加精簡以外,還將開發(fā)者帶入了程序設(shè)計(jì)的一個新的領(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ā)代號“Orcas”)
發(fā)布時間:2007 年 11 月
C#3.0的主要功能:自動實(shí)現(xiàn)的屬性、匿名類型、查詢表達(dá)式、Lambda 表達(dá)式、表達(dá)式樹、擴(kuò)展方法、隱式類型本地變量、分部方法、對象和集合初始值設(shè)定項(xiàng)
2005年9 月份的PDC大會——C#3.0(研發(fā)代號“Orcas”——魔鬼)的技術(shù)預(yù)覽版。說到C# 3.0,就不得不提一下微軟的LINQ 項(xiàng)目,LINQ(語言集成查詢,LanguageIntegrated Query)提出了一種通過面向?qū)ο笳Z法來實(shí)現(xiàn)對非面向?qū)ο髷?shù)據(jù)源的查詢技術(shù),可查詢的數(shù)據(jù)源從關(guān)系型數(shù)據(jù)庫延伸到一般意義上的集合(如數(shù)組和列表)以及XML。而C# 3.0則是率先實(shí)現(xiàn)了LINQ的語言。
在C# 3.0中,可以用類似于SQL語句的語法從一個數(shù)據(jù)源中輕松地得到滿足一定條件的對象集合。例如要查找一個字符串?dāng)?shù)組names中所有長度大于5的字符串,就可以寫:var longname = from n in nameswheren.Length > 5 select n;
這樣就得到一個新的字符數(shù)組longname,其中包含了所需要的結(jié)果。這種語句稱作查詢語句,與SQL語句唯一的區(qū)別是C#中的查詢語句往往把select子句放到最后(這反而倒有些類似于中文的閱讀順序了)。初次看到這樣一個語句,可能會有很大疑問:這還是C#語言嗎?這的確是合乎語法規(guī)則的C#代碼,而且編譯器可以識別這種語法。然而實(shí)際上,C#編譯器并不會對這種語法進(jìn)行實(shí)際的的編譯,而是將其翻譯為正常的方法調(diào)用。
C# 3.0 開始為 C# 轉(zhuǎn)變?yōu)槊嫦驅(qū)ο?函數(shù)式混合語言奠定基礎(chǔ)。