C#讀作C Sharp,作為Microsoft的下一代面向?qū)ο蟮恼Z言,能夠讓開發(fā)人員在.NET平臺上快速地建立大量的應(yīng)用程序。按照Microsoft給出的定義,C#是一種源自于C和C++的,簡單的、現(xiàn)代的、面向?qū)ο蟮暮皖愋桶踩某绦蛟O(shè)計語言。C#為程序員提供了開發(fā)飛速發(fā)展的Web應(yīng)用程序所需要的強(qiáng)大而靈活的功能。與C++相比,C#將更容易被人們理解和接受,未來大量.NET平臺的應(yīng)用將由C#開發(fā),C#將是未來開發(fā)企業(yè)級分布式應(yīng)用程序的首選。
一、C#的特點 C#就是這樣一種編程語言,它使程序員能快速地為新一代Microsoft .NET平臺開發(fā)出應(yīng)用程序。具體來說,微軟的C#具有如下特點:
1.快速應(yīng)用開發(fā)(RAD)功能
支持快速開發(fā)(Rapid application development,RAD)可以說是目前開發(fā)語言最為重要的一大功能,支持快速開發(fā)可以使得開發(fā)人員的開發(fā)效率倍增,從而使得他們可以從繁重的重復(fù)性勞動中解放出來。
C#的RAD功能主要表現(xiàn)在垃圾收集、指代等特性上。垃圾收集機(jī)制將減輕開發(fā)人員對內(nèi)存的管理負(fù)擔(dān),而指代功能更是可以讓開發(fā)者不經(jīng)過內(nèi)部類就調(diào)用函數(shù)。利用C#的這些功能,可以使開發(fā)者通過較少的代碼來實現(xiàn)更強(qiáng)大的應(yīng)用程序,并且能夠更好地避免錯誤發(fā)生,從而縮短了應(yīng)用系統(tǒng)的開發(fā)周期。
2.語言的自由性
用C#編寫的程序能最大程度地和任何支持.NET的語言互相交換信息。能夠繼承和使用任何語言所編寫的程序,這樣做的好處是節(jié)省了大量的工作,你不必把COBOL等語言強(qiáng)行改成另一種語言,.NET讓各種語言真正地互相交流了。
3.強(qiáng)大的Web服務(wù)端組件
在C#的Web編程中,最讓人興奮的是Web服務(wù)端的組件,它們不僅包括傳統(tǒng)組件,還包括那些能夠自動連接服務(wù)的可編程組件,你可以用C#編寫自己的服務(wù)器端組件,使用它們可以更自由、更容易地進(jìn)行數(shù)據(jù)綁定。
4.支持跨平臺
隨著互聯(lián)網(wǎng)應(yīng)用程序的應(yīng)用越來越廣,開發(fā)人員所設(shè)計的應(yīng)用程序必須具有強(qiáng)大的跨平臺性。C#編寫的應(yīng)用程序就具有強(qiáng)大的跨平臺性,這種跨平臺性也包括了C#程序的客戶端可以運行在不同類型的客戶端上,比如PDA、手機(jī)等非PC裝置。
5.與XML的融合
由于XML技術(shù)真正融入到了.NET之中,C#的編程變成了真正意義的網(wǎng)絡(luò)編程,甚至可以說.NET和C#是專為XML而設(shè)計,使用C#的程序員可以輕松用C#內(nèi)含的類來使用XML技術(shù)。就這方面而言,目前C#提供給了程序員裹多的自由和更好的性能來使用XML。
6.對C++的繼承
C#繼承并保留了C++強(qiáng)大的功妮,例如, C#保留了類型安全的檢測和重載功能,C#還提供了一些新功能取代了一些原來的ANSI C預(yù)處理程序的功能,提高了語言的類型安全等安全性。
二、簡單應(yīng)用程序舉例與分析 在全面、系統(tǒng)地學(xué)習(xí)以前,我們先來看一個C#的經(jīng)典程序“Welcome”。
1.Welcome程序
第一個程序總是很簡單的,我們讓用戶通過鍵盤輸入自己的名字,然后程序會在屏幕上打印出一條歡迎信息。程序代碼如下:
//源文件:welcome.cs
using System;
class Welcome
{
static void Main(){
Console.WriteLine("Please enter your name:");
//要求用戶輸入姓名;
Console.ReadLine();//讀取用戶輸入;
Console.WriteLine("Welcome to you!");
/*本行代碼用于打印歡迎信息;
你可以在這里添加自己的代碼;
程序結(jié)束*/
}
}
上面的代碼你可以在任意一種字處理軟件中進(jìn)行編寫,然后以文件名“Welcome.cs”存盤。典型的C#源文件都是以“.cs”作為文件的擴(kuò)展名的。
注意:C#語言是大小寫敏感的。
2.代碼分析
(1)名字空間
using System表示導(dǎo)入名字空間。如果你熟悉C或者C++編程,那么你一定經(jīng)常使用“#include”之類的語句來導(dǎo)入其他C或者C++源文件。C#的含義與此類似,用于導(dǎo)入預(yù)定的元素。“System”就是一個名字空間,“using”指令允許對屬于該名字空間成員的類型無限制引用。
(2)類和類的方法
在程序第二行,class Welcome聲明了一個類,類的名字叫做“Welcome”。這個程序讓我們所作的事情都依靠它來完成。
Static void Main()表示類“Welcome”中的一個方法,方法總是為我們完成某項工作的。在C#中,程序的執(zhí)行總是從“main()”方法開始,一個程序中不允許出現(xiàn)兩個或者兩個以上的“main()”方法。
就像一個文件夾可以容納多個文件一樣,一個名字空間可以被視為某些類的一個容器。因為.NET有很多類,所以名字空間是必要的。微軟已經(jīng)編寫了數(shù)以千計的基類,同吮任何合理的大型應(yīng)用程序都可以定義更多的類。通過把類放入名字空間可以把相關(guān)的類組織起來,并且可以避免命名沖突。
(3)“{”和“}”
與C和C++一樣,源代碼被包含在一對大括號之中,每一個右括號總是和它前面離它最近的一個左括號相配套。如果左括號和右括號沒有全部的配套,那么這就是一個錯誤的程序。所有語句都以分號“;”結(jié)束。
(4)程序的輸入與輸出
程序所完成的輸入輸出功能都是通過“Console”來完成的,“Console”是在名字空間“System”中已經(jīng)定義好的一個類,你根本不需要管它是怎么完成工作的,只要直接使用它就可以了。
上面的程序代碼中,類“Console”為我們展現(xiàn)了兩個最基本的方法:ReadLine和WriteLine。Console.ReadLine表示接受輸入設(shè)備輸入,Console.WriteLine用于在輸出設(shè)備中輸出。
3.運行程序
(1)執(zhí)行代碼
理解了源程序中每一條代碼的具體含義后,下一步我們要做的就是讓這個程序真正能夠運行。
如果你的計算機(jī)上安裝了Visual Studio .NET,則可以在集成開發(fā)環(huán)境(Integrated Developer Environment,IDE)中直接編譯并執(zhí)行源文件。如果你不具備這個條件,那么安裝Microsoft .NET Framework SDK也是可以的。實際上,.NET平臺內(nèi)置了C#的編譯器。下面讓我們使用微軟提供的命令行編譯器來對上面的程序進(jìn)行編譯。
啟動一個命令提示符,輸入一行命令:
csc welcome.cs
此時,Welcome.cs文件將被編譯并運行,屏幕上會出現(xiàn)一行字符,提示你輸入姓名:
Please enter your name:
輸入任意安符并回來確認(rèn),屏幕是將打印出歡迎信息:
Welcome to you!
在C#中,編譯器只執(zhí)行編譯過程,而在C或者C++中要經(jīng)過編譯和鏈接兩個階段。也就是說,C#源文件并不被編譯成目標(biāo)文件(.obj),而是直接生成可執(zhí)行文件(.exe)或動態(tài)鏈接庫(.dll)。C#編譯器中不需要包含鏈接器。
(2)命令行編譯器選項
我們可以靈活地使用.NET平臺提供的命令行編譯器的不同選項,選擇不同的編譯方式。
例如,我們希望對源文件進(jìn)行編譯,生成一個名為MyWelcome.exe的可執(zhí)行文件,我們可以采用下面的命令:
csc/out MyWelcome.exe Welcome.cs
有如不同的命令參數(shù)一樣,不同的命令行編譯器選項會影響我們編譯執(zhí)行的結(jié)果,如果不知道各個選項的具體含義,你可以通過編譯器幫助來獲得:
csc/?
4.添加注釋
C#中注釋的方式和C、C++沒有什么區(qū)別,每行中雙斜杠“//”后面的內(nèi)容,以及在分割符“/*”和“*/”之間的內(nèi)容都將被編譯器忽略。其中,“//”表示進(jìn)行單行注釋;“/*”和“*/”表示多行注釋。
三、C#語言基礎(chǔ) (一)數(shù)據(jù)類型
應(yīng)用程序總是要處理數(shù)據(jù)的,我們必須要讓計算機(jī)了解需要處理什么樣的數(shù)據(jù),用什么方式進(jìn)行處理,按什么格式保存數(shù)據(jù)等。這就需要了解程序設(shè)計語言的數(shù)據(jù)類型。
1.值類型
在學(xué)習(xí)各種類型以前,我們先提一下變量的概念,變量即是存儲信息的基本單元,另一方面,我們也可以把變量理解為計算機(jī)內(nèi)存中的一個存儲空間。C#的值類型可以分為:簡單類型、結(jié)構(gòu)類型、枚舉類型。
簡單類型是直接由一系列元素構(gòu)成的數(shù)據(jù)類型。C#中為我們提供了一組已定義的簡單類型。這些簡單類型可分為:整數(shù)類型、布爾類型、字符類型和實數(shù)類型。
(1)整數(shù)類型
整數(shù)類型的變量的值為整數(shù)。C#中有九種整數(shù)類型:短字節(jié)型(sbyte)、字節(jié)型(byte)、短整型(short)、無符號短整型(ushort)、整型(int)、無符號整型(uint)、長整型(long)、無符號長整型(ulong)。這些整型類型在數(shù)學(xué)上的表示以及在計算機(jī)中的取值范圍如下表所示。
(2)布爾類型
布爾類型是用來表示一個事件或狀態(tài)的“真”和“假”。我們知道,不管任何數(shù)據(jù),在計算機(jī)的內(nèi)部都是采用二進(jìn)制方式處理和存儲。布爾類型表示的邏輯變量只有兩種取值:“真”或“假”,在C#中分別采用“true”和“false”表示。
(3)實數(shù)類型
浮點類型:數(shù)學(xué)中的實數(shù)不僅包括整數(shù),而且包括小數(shù)。小數(shù)在C#中采用單精度(float)和雙精度(double)。它們的差別在于取值范圍和精度不同。
單精度:取值范圍在±1.5*10
-34到3.4*10
38之間,精度為7位數(shù)。
雙精度:取值范圍在±5.0*10
-324到1.7*10
308之間,精度為15到16位數(shù)。
十進(jìn)制類型(decimal):是C#專門為我們定義的一種數(shù)據(jù)類型,主要用于方便我們在金融和貨幣方面的計算。C#通過提供這種專門的數(shù)據(jù)類型,使我們能夠更快捷地設(shè)計這方面的應(yīng)用程序。其取值范圍從大約1.0*10
-28到7.9*10
28 的28到29位有效數(shù)字。
當(dāng)定義一個十進(jìn)制變量并賦值給它時,使用m下標(biāo)以表明它是一個十進(jìn)制類型。如果省略了m下標(biāo),在變量被賦值之前,它將被編譯器當(dāng)作雙精度數(shù)據(jù)類型來處理。下面是一個合法的賦值:
decimal d_value=1.0m;
(4)字符類型
除了數(shù)字以外,計算機(jī)還需要處理的信息主要就是字符了。字符包括數(shù)字字符、英文字符、表達(dá)符號等,C#提供的字符類型采用了國際公認(rèn)的Unicode字符集標(biāo)準(zhǔn)。一個Unicode的標(biāo)準(zhǔn)字符長度為16位,用它可以表示大多數(shù)的字符類型了。可以按下面的方法給一個字符變量賦值,如:
char c=′A′;
另外,我們還可以直接通過十六進(jìn)制轉(zhuǎn)義符(前綴\x)或Unicode表示法給字符型變量賦值)(前綴\u),用來在程序中指代特殊的控制字符。
(5)結(jié)構(gòu)類型
在具體的程序設(shè)計中我們經(jīng)常要把一組相關(guān)的信息存放在一起。把一系列相關(guān)的變量組織成為一個單一實體的過程,稱為生成結(jié)構(gòu)的過程。這個單一實體的類型我們就叫做結(jié)構(gòu)類型,每一個變量稱為結(jié)構(gòu)的成員。結(jié)構(gòu)類型的變量采用struct來進(jìn)行聲明。下面的程序代碼說明定義一個通訊錄記錄結(jié)構(gòu)(包括姓名、電話和地址)的定義。
Struct PhoneBook{
public string name;
public string phone;
public string address;
}
PhoneBook p1;
p1就是一個通訊錄(PhoneBook)結(jié)構(gòu)類型的變量。上面聲明中的“public”表示對結(jié)構(gòu)類型的成員的訪問權(quán)限。對結(jié)構(gòu)成員的訪問通過結(jié)構(gòu)變量名加上訪問符“.”號,后跟成員的名稱:
p1.name=″tom″;
結(jié)構(gòu)類型包含的成員類型沒有限制,可以相同也可不同。
(6)枚舉類型
枚舉(enum)實際上是為一組在邏輯上密不可分的整數(shù)值提供便于記憶的符號。下面的程序代碼聲明了一個代表星期的枚舉類型的變量。
Enum WeekDay{
Sunday,Monday,Tuesday,Wednesday,Friday,Saturday
};
WeekDay day;
注意:枚舉類型的變量在某一時刻只能取枚舉中某一個元素的值。如,day這個表示“星期”的枚舉的變量,它的值要么是Sunday,要么是Monday或其他的星期元素,但它在一個時刻只能代表具體的某一天,不能既是星期二,又是星期三。
Day=Tuseday;
按照系統(tǒng)默認(rèn),枚舉中的每個元素都是整型(int),且第一個元素刪去的值為0,它后面的每一個連續(xù)的元素的值按加1遞增。在枚舉中,也可以給元素直接賦值。下面的程序代碼把星期一的值設(shè)為1,其后的元素的值分別為2,3……
enum WeekDay{
Sunday=1,Monday,Tuesday,Wednesday,Friday,Saturday
};
為枚舉類型的元素所賦值的值的類型限于long、int、short和byte等整數(shù)類型。
2.引用類型
在這里,引用的含義是該類型的變量不直接存儲所包含的值,而是指向它所要存儲的值。即引用類型存儲實際數(shù)據(jù)的引用值的地址。C#中的引用類型有四種:類、代表、數(shù)組和接口。
(1)類
類是面向?qū)ο缶幊痰幕締挝?,是一種包含數(shù)據(jù)成員、函數(shù)成員和嵌套類型的數(shù)據(jù)結(jié)構(gòu)。類的數(shù)據(jù)成員有常量、域和事件。函數(shù)成員包括方法、屬性、索引指示器、運算符等。類和結(jié)構(gòu)同樣都包含了自己的成員,但它們之間最主要的區(qū)別在于:類是引用類型,而結(jié)構(gòu)是值類型。
類支持繼承機(jī)制,通過繼承,派生類可以擴(kuò)展基類的數(shù)據(jù)成員和函數(shù)成員,進(jìn)而達(dá)到代碼重用和設(shè)計重用的目的。下面介紹兩個經(jīng)常用到的類:
object類:它是所有其他類型的基類,C#中的所有類型都直接或是間接地從object類中繼承。因此,對一個object的變量可以賦予任何類型的值。
Int x=25;
object obj1;
obj1=x;
object obj2=′A′;
對object類型的變量聲明采用object關(guān)鍵字,這個關(guān)鍵字是在.NET平臺中為我們提供的預(yù)定義的名字空間System中定義的,是類System.Object的別名。
String類:專門用于對字符串的操作。同樣,這個類也是在.NET平臺中為我們提供的預(yù)定義的名字空間System中定義的,是類System.String的別名。
字符串在實際中應(yīng)用非常的廣泛,在類的定義中封裝了許多內(nèi)部的操作,我們只要簡單地加以利用就可以了??梢杂眉犹?#8220;+”合并兩個字符串,采用下標(biāo)從字符串中獲取字符等。
String String1=″Welcome″;
string String2=″Welcome″+″everyone″;
char c=String1[0];
bool b=(String1==String2);
(2)代表
在C#中取消了C和C++中的指針的這個概念。而代表實際上相當(dāng)于是C#中的函數(shù)指針原型,與指針不同的是,代表在C#中是類型安全的。
在聲明代表時,只需要指定代表指向的原型的類型,它不能有返回值,也不能帶有輸出類型的參數(shù)。如我們可以聲明一個指向int類型函數(shù)原型的代表:
delegate int MyDelegate();
如果我們聲明了自己的一個代表,那么它就是對系統(tǒng)定義的類System.deldgate的一個擴(kuò)展。
(3)數(shù)組
在進(jìn)行批量處理數(shù)據(jù)的時候,我們要用到數(shù)組。數(shù)組是一組類型相同的有序數(shù)據(jù)。數(shù)組按照數(shù)組名、數(shù)據(jù)元素的類型和維數(shù)來進(jìn)行描述。C#中提供Ststem.Array類是所有數(shù)組類型的基類。
數(shù)組的聲明格式為:
non-array-type[dim-separators] array-instance name;
比如我們聲明一個整數(shù)數(shù)組:
int[]arr;
在定義數(shù)組時,可以預(yù)先指定數(shù)組元素的個數(shù),這時在“[]”中定義數(shù)組的元素個數(shù),它的個數(shù)可以通過數(shù)組名加圓點加“Length”獲得。而在使用數(shù)組時,可以在“[]”中加入下標(biāo)來取得對應(yīng)的數(shù)組元素。C#中的數(shù)組元素的下標(biāo)是從0開始的,以后遞增。
在C#中數(shù)組可以是一維的也可以是多維的,同樣也支持矩陣和參差不齊的數(shù)組。其中一維數(shù)組最為普遍,用得也最多。
Class Tese
{
static void Main(){ //可動態(tài)生成數(shù)組的長度
string[] a1; //一維數(shù)組string
string[] a2; //二維數(shù)組string
string[] a3; //三維數(shù)組string
}
}
(4)接口
接口定義了一個協(xié)議(conrtact)。一個類或結(jié)構(gòu)要實現(xiàn)接口就必須堅持這種協(xié)議。接口可以包括方法、屬性、索引和事件作為成員。下面的程序代碼說明了一個接口,它包含一個索引、一個事件E、一個方法F和一個屬性P。
Interface Iexampie
{
string this[int index]{get; ste;}\
event EventHandler E;
void F(int value);
string P{get; set;}
}