C#基礎(chǔ)教程Word版_第1頁(yè)
C#基礎(chǔ)教程Word版_第2頁(yè)
C#基礎(chǔ)教程Word版_第3頁(yè)
C#基礎(chǔ)教程Word版_第4頁(yè)
C#基礎(chǔ)教程Word版_第5頁(yè)
已閱讀5頁(yè),還剩522頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C#基礎(chǔ)教程第一章 C#語(yǔ)言基礎(chǔ)本章介紹C#語(yǔ)言的基礎(chǔ)知識(shí),希望具有C語(yǔ)言的讀者能夠基本掌握C#語(yǔ)言,并以此為基礎(chǔ),能夠進(jìn)一步學(xué)習(xí)用C#語(yǔ)言編寫window應(yīng)用程序和Web應(yīng)用程序。當(dāng)然僅靠一章的內(nèi)容就完全掌握C#語(yǔ)言是不可能的,如需進(jìn)一步學(xué)習(xí)C#語(yǔ)言,還需要認(rèn)真閱讀有關(guān)C#語(yǔ)言的專著。1.1 C#語(yǔ)言特點(diǎn)Microsoft.NET(以下簡(jiǎn)稱.NET)框架是微軟提出的新一代Web軟件開(kāi)發(fā)模型,C#語(yǔ)言是.NET框架中新一代的開(kāi)發(fā)工具。C#語(yǔ)言是一種現(xiàn)代、面向?qū)ο蟮恼Z(yǔ)言,它簡(jiǎn)化了C+語(yǔ)言在類、命名空間、方法重載和異常處理等方面的操作,它摒棄了C+的復(fù)雜性,更易使用,更少出錯(cuò)。它使用組件編程,和V

2、B一樣容易使用。C#語(yǔ)法和C+和JAVA語(yǔ)法非常相似,如果讀者用過(guò)C+和JAVA,學(xué)習(xí)C#語(yǔ)言應(yīng)是比較輕松的。用C#語(yǔ)言編寫的源程序,必須用C#語(yǔ)言編譯器將C#源程序編譯為中間語(yǔ)言(MicroSoft Intermediate Language,MSIL)代碼,形成擴(kuò)展名為exe或dll文件。中間語(yǔ)言代碼不是CPU可執(zhí)行的機(jī)器碼,在程序運(yùn)行時(shí),必須由通用語(yǔ)言運(yùn)行環(huán)境(Common Language Runtime,CLR)中的既時(shí)編譯器(JUST IN Time,JIT)將中間語(yǔ)言代碼翻譯為CPU可執(zhí)行的機(jī)器碼,由CPU執(zhí)行。CLR為C#語(yǔ)言中間語(yǔ)言代碼運(yùn)行提供了一種運(yùn)行時(shí)環(huán)境,C#語(yǔ)言的CL

3、R和JAVA語(yǔ)言的虛擬機(jī)類似。這種執(zhí)行方法使運(yùn)行速度變慢,但帶來(lái)其它一些好處,主要有:l 通用語(yǔ)言規(guī)范(Common Language Specification,CLS):.NET系統(tǒng)包括如下語(yǔ)言:C#、C+、VB、J#1 / 527,他們都遵守通用語(yǔ)言規(guī)范。任何遵守通用語(yǔ)言規(guī)范的語(yǔ)言源程序,都可編譯為相同的中間語(yǔ)言代碼,由CLR負(fù)責(zé)執(zhí)行。只要為其它操作系統(tǒng)編制相應(yīng)的CLR,中間語(yǔ)言代碼也可在其它系統(tǒng)中運(yùn)行。l 自動(dòng)內(nèi)存管理:CLR內(nèi)建垃圾收集器,當(dāng)變量實(shí)例的生命周期結(jié)束時(shí),垃圾收集器負(fù)責(zé)收回不被使用的實(shí)例占用的內(nèi)存空間。不必象C和C+語(yǔ)言,用語(yǔ)句在堆中建立的實(shí)例,必須用語(yǔ)句釋放實(shí)例占用的內(nèi)

4、存空間。也就是說(shuō),CLR具有自動(dòng)內(nèi)存管理功能。l 交叉語(yǔ)言處理:由于任何遵守通用語(yǔ)言規(guī)范的語(yǔ)言源程序,都可編譯為相同的中間語(yǔ)言代碼,不同語(yǔ)言設(shè)計(jì)的組件,可以互相通用,可以從其它語(yǔ)言定義的類派生出本語(yǔ)言的新類。由于中間語(yǔ)言代碼由CLR負(fù)責(zé)執(zhí)行,因此異常處理方法是一致的,這在調(diào)試一種語(yǔ)言調(diào)用另一種語(yǔ)言的子程序時(shí),顯得特別方便。l 增加安全:C#語(yǔ)言不支持指針,一切對(duì)內(nèi)存的訪問(wèn)都必須通過(guò)對(duì)象的引用變量來(lái)實(shí)現(xiàn),只允許訪問(wèn)內(nèi)存中允許訪問(wèn)的部分,這就防止病毒程序使用非法指針訪問(wèn)私有成員。也避免指針的誤操作產(chǎn)生的錯(cuò)誤。CLR執(zhí)行中間語(yǔ)言代碼前,要對(duì)中間語(yǔ)言代碼的安全性,完整性進(jìn)行驗(yàn)證,防止病毒對(duì)中間語(yǔ)言代碼

5、的修改。l 版本支持:系統(tǒng)中的組件或動(dòng)態(tài)聯(lián)接庫(kù)可能要升級(jí),由于這些組件或動(dòng)態(tài)聯(lián)接庫(kù)都要在注冊(cè)表中注冊(cè),由此可能帶來(lái)一系列問(wèn)題,例如,安裝新程序時(shí)自動(dòng)安裝新組件替換舊組件,有可能使某些必須使用舊組件才可以運(yùn)行的程序,使用新組件運(yùn)行不了。在.NET中這些組件或動(dòng)態(tài)聯(lián)接庫(kù)不必在注冊(cè)表中注冊(cè),每個(gè)程序都可以使用自帶的組件或動(dòng)態(tài)聯(lián)接庫(kù),只要把這些組件或動(dòng)態(tài)聯(lián)接庫(kù)放到運(yùn)行程序所在文件夾的子文件夾bin中,運(yùn)行程序就自動(dòng)使用在bin文件夾中的組件或動(dòng)態(tài)聯(lián)接庫(kù)。由于不需要在注冊(cè)表中注冊(cè),軟件的安裝也變得容易了,一般將運(yùn)行程序及庫(kù)文件拷貝到指定文件夾中就可以了。l 完全面向?qū)ο螅翰幌驝+語(yǔ)言,即支持面向過(guò)程程序

6、設(shè)計(jì),又支持面向?qū)ο蟪绦蛟O(shè)計(jì),C#語(yǔ)言是完全面向?qū)ο蟮?,在C#中不再存在全局函數(shù)、全局變量,所有的函數(shù)、變量和常量都必須定義在類中,避免了命名沖突。C#語(yǔ)言不支持多重繼承。1.2 編寫控制臺(tái)應(yīng)用程序 使用SDK命令行工具編寫控制臺(tái)程序第一個(gè)程序總是非常簡(jiǎn)單的,程序首先讓用戶通過(guò)鍵盤輸入自己的名字,然后程序在屏幕上打印一條歡迎信息。程序的代碼是這樣的:using System;/導(dǎo)入命名空間。/為C#語(yǔ)言新增解釋方法,解釋到本行結(jié)束class Welcome/類定義,類的概念見(jiàn)下一節(jié) /*解釋開(kāi)始,和C語(yǔ)言解釋用法相同解釋結(jié)束*/static void Main()/主程序,程序入口函數(shù),必須在

7、一個(gè)類中定義 Console.WriteLine("請(qǐng)鍵入你的姓名:");/控制臺(tái)輸出字符串Console.ReadLine();/從鍵盤讀入數(shù)據(jù),輸入回車結(jié)束Console.WriteLine("歡迎!");可以用任意一種文本編輯軟件完成上述代碼的編寫,然后把文件存盤,假設(shè)文件名叫做welcome.cs,C#源文件是以cs作為文件的擴(kuò)展名。和C語(yǔ)言相同,C#語(yǔ)言是區(qū)分大小寫的。高級(jí)語(yǔ)言總是依賴于許多在程序外部預(yù)定義的變量和函數(shù)。在C或C+中這些定義一般放到頭文件中,用#include語(yǔ)句來(lái)導(dǎo)入這個(gè)頭文件。而在C#語(yǔ)言中使用using語(yǔ)句導(dǎo)入名字空間,u

8、sing System語(yǔ)句意義是導(dǎo)入System名字空間,C#中的using語(yǔ)句的用途與C+中#include語(yǔ)句的用途基本類似,用于導(dǎo)入預(yù)定義的變量和函數(shù),這樣在自己的程序中就可以自由地使用這些變量和函數(shù)。如果沒(méi)有導(dǎo)入名字空間的話我們?cè)撛趺崔k呢?程序還能保持正確嗎?答案是肯定的,那樣的話我們就必須把代碼改寫成下面的樣子:class Welcome static void Main() System.Console.WriteLine("請(qǐng)鍵入你的姓名:");System.Console.ReadLine();System.Console.WriteLine("歡

9、迎!");也就是在每個(gè)Console前加上一個(gè)前綴System.,這個(gè)小原點(diǎn)表示Console是作為System的成員而存在的。C#中拋棄了C和C+中繁雜且極易出錯(cuò)的操作符象:和->等,C#中的復(fù)合名字一律通過(guò).來(lái)連接。System是.Net平臺(tái)框架提供的最基本的名字空間之一,有關(guān)名字空間的詳細(xì)使用方法將在以后詳細(xì)介紹,這里只要學(xué)會(huì)怎樣導(dǎo)入名字空間就足夠了。程序的第二行class Welcome聲明了一個(gè)類,類的名字叫做Welcome。C#程序中每個(gè)變量或函數(shù)都必須屬于一個(gè)類,包括主函數(shù)Main(),不能象C或C+那樣建立全局變量。C#語(yǔ)言程序總是從Main()方法開(kāi)始執(zhí)行,一

10、個(gè)程序中不允許出現(xiàn)兩個(gè)或兩個(gè)以上的Main()方法。請(qǐng)牢記C#中Main()方法必須被包含在一個(gè)類中,Main第一個(gè)字母必須大寫,必須是一個(gè)靜態(tài)方法,也就是Main()方法必須使用static修飾。static void Main()是類Welcome中定義的主函數(shù)。靜態(tài)方法意義見(jiàn)以后章節(jié)。程序所完成的輸入輸出功能是通過(guò)Console類來(lái)完成的,Console是在名字空間System中已經(jīng)定義好的一個(gè)類。Console類有兩個(gè)最基本的方法WriteLine和ReadLine。ReadLine表示從輸入設(shè)備輸入數(shù)據(jù),WriteLine則用于在輸出設(shè)備上輸出數(shù)據(jù)。如果在電腦上安裝了Visual S

11、tudio.Net,則可以在集成開(kāi)發(fā)環(huán)境中直接選擇快捷鍵或菜單命令編譯并執(zhí)行源文件。如果您不具備這個(gè)條件,那么至少需要安裝Microsoft.Net Framework SDK,這樣才能夠運(yùn)行C#語(yǔ)言程序。Microsoft.Net Framework SDK中內(nèi)置了C#的編譯器csc.exe,下面讓我們使用這個(gè)微軟提供的命令行編譯器對(duì)程序welcome.cs進(jìn)行編譯。假設(shè)已經(jīng)將welcome.cs文件保存在d:Charp目錄下,啟動(dòng)命令行提示符,在屏幕上輸入一行命令:d:回車,cd Charp回車,鍵入命令:C:WINNTMicrosoft.NETFrameworkv1.0.3705csc

12、welcome.cs如果一切正常welcome.cs文件將被編譯,編譯后生成可執(zhí)行文件Welcome.exe??梢栽诿钐崾痉翱谶\(yùn)行可執(zhí)行文件Welcome.exe,屏幕上出現(xiàn)一行字符提示您輸入姓名:請(qǐng)鍵入你的姓名:輸入任意字符并按下回車鍵,屏幕將打印出歡迎信息:歡迎!注意,和我們使用過(guò)的絕大多數(shù)編譯器不同,在C#中編譯器只執(zhí)行編譯這個(gè)過(guò)程,而在C和C+中要經(jīng)過(guò)編譯和鏈接兩個(gè)階段。換而言之C#源文件并不被編譯為目標(biāo)文件.obj,而是直接生成可執(zhí)行文件.exe或動(dòng)態(tài)鏈接庫(kù).dll,C#編譯器中不需要包含鏈接器。 使用Visual Studio.Net建立控制臺(tái)程序(1) 運(yùn)行Visual St

13、udio.Net程序,出現(xiàn)如圖1.2.2A界面。(2) 單擊新建項(xiàng)目按鈕,出現(xiàn)如圖1.2.2B對(duì)話框。在項(xiàng)目類型(P)編輯框中選擇Visual C#項(xiàng)目,在模板(T)編輯框中選擇控制臺(tái)應(yīng)用程序,在名稱(N)編輯框中鍵入e1,在位置(L)編輯框中鍵入D:csarp,必須預(yù)先創(chuàng)建文件夾D:csarp。也可以單擊瀏覽按鈕,在打開(kāi)文件對(duì)話框中選擇文件夾。單擊確定按鈕,創(chuàng)建項(xiàng)目。出現(xiàn)如圖1.2.2C界面。編寫一個(gè)應(yīng)用程序,可能包含多個(gè)文件,才能生成可執(zhí)行文件,所有這些文件的集合叫做一個(gè)項(xiàng)目。(3) 修改class1.cs文件如下,有陰影部分是新增加的語(yǔ)句,其余是集成環(huán)境自動(dòng)生成的。using Syste

14、m;namespace e1 / <summary> / Class1 的摘要說(shuō)明。 / </summary> class Class1 / <summary> / 應(yīng)用程序的主入口點(diǎn)。 / </summary> STAThread static void Main(string args) / / TODO: 在此處添加代碼以啟動(dòng)應(yīng)用程序 / Console.WriteLine("請(qǐng)鍵入你的姓名:"); Console.ReadLine(); Console.WriteLine("歡迎!"); (4) 按

15、CTRL+F5鍵,運(yùn)行程序,如右圖,和1.2.1節(jié)運(yùn)行效果相同。屏幕上出現(xiàn)一行字符,提示您輸入姓名:請(qǐng)鍵入你的姓名:輸入任意字符并按下回車鍵,屏幕將打印出歡迎信息:歡迎!輸入回車退出程序。 圖1.2.2A 圖1.2.2B 1.3 類的基本概念C#語(yǔ)言是一種現(xiàn)代、面向?qū)ο蟮恼Z(yǔ)言。面向?qū)ο蟪绦蛟O(shè)計(jì)方法提出了一個(gè)全新的概念:類,它的主要思想是將數(shù)據(jù)(數(shù)據(jù)成員)及處理這些數(shù)據(jù)的相應(yīng)方法(函數(shù)成員)封裝到類中,類的實(shí)例則稱為對(duì)象。這就是我們常說(shuō)的封裝性。 類的基本概念類可以認(rèn)為是對(duì)結(jié)構(gòu)的擴(kuò)充,它和C中的結(jié)構(gòu)最大的不同是:類中不但可以包括數(shù)據(jù),還包括處理這些數(shù)據(jù)的函數(shù)。類是對(duì)數(shù)據(jù)和處理數(shù)據(jù)的方法(函數(shù))的

16、封裝。類是對(duì)某一類具有相同特性和行為的事物的描述。例如,定義一個(gè)描述個(gè)人情況的類Person如下:using System;class Person/類的定義,class是保留字,表示定義一個(gè)類,Person是類名 private string name="張三"/類的數(shù)據(jù)成員聲明private int age=12;/private表示私有數(shù)據(jù)成員public void Display()/類的方法(函數(shù))聲明,顯示姓名和年齡 Console.WriteLine("姓名:0,年齡:1",name,age);public void SetName(str

17、ing PersonName)/修改姓名的方法(函數(shù)) name=PersonName;public void SetAge(int PersonAge) age=PersonAge;Console.WriteLine("姓名:0,年齡:1",name,age)的意義是將第二個(gè)參數(shù)變量name變?yōu)樽址畹?位置,將第三個(gè)參數(shù)變量age變?yōu)樽址畹?位置,將第一個(gè)參數(shù)表示的字符串在顯示器上輸出。大家注意,這里我們實(shí)際定義了一個(gè)新的數(shù)據(jù)類型,為用戶自己定義的數(shù)據(jù)類型,是對(duì)個(gè)人的特性和行為的描述,他的類型名為Person,和int,char等一樣為一種數(shù)據(jù)類型。用定義新數(shù)據(jù)類

18、型Person類的方法把數(shù)據(jù)和處理數(shù)據(jù)的函數(shù)封裝起來(lái)。類的聲明格式如下:屬性 類修飾符 class 類名類體其中,關(guān)鍵字class、類名和類體是必須的,其它項(xiàng)是可選項(xiàng)。類修飾符包括new、public、protected、internal、private、abstract和sealed,這些類修飾符以后介紹。類體用于定義類的成員。1.3.2 類成員的存取控制一般希望類中一些數(shù)據(jù)不被隨意修改,只能按指定方法修改,既隱蔽一些數(shù)據(jù)。同樣一些函數(shù)也不希望被其它類程序調(diào)用,只能在類內(nèi)部使用。如何解決這個(gè)問(wèn)題呢?可用訪問(wèn)權(quán)限控制字,常用的訪問(wèn)權(quán)限控制字如下:private(私有),public(公有)。在

19、數(shù)據(jù)成員或函數(shù)成員前增加訪問(wèn)權(quán)限控制字,可以指定該數(shù)據(jù)成員或函數(shù)成員的訪問(wèn)權(quán)限。私有數(shù)據(jù)成員只能被類內(nèi)部的函數(shù)使用和修改,私有函數(shù)成員只能被類內(nèi)部的其它函數(shù)調(diào)用。類的公有函數(shù)成員可以被類的外部程序調(diào)用,類的公有數(shù)據(jù)成員可以被類的外部程序直接使用修改。公有函數(shù)實(shí)際是一個(gè)類和外部通訊的接口,外部函數(shù)通過(guò)調(diào)用公有函數(shù),按照預(yù)先設(shè)定好的方法修改類的私有成員。對(duì)于上述例子,name和age是私有數(shù)據(jù)成員,只能通過(guò)公有函數(shù)SetName()和SetAge()修改,既它們只能按指定方法修改。這里再一次解釋一下封裝,它有兩個(gè)意義,第一是把數(shù)據(jù)和處理數(shù)據(jù)的方法同時(shí)定義在類中。第二是用訪問(wèn)權(quán)限控制字使數(shù)據(jù)隱蔽。1

20、.3.3 類的對(duì)象Person類僅是一個(gè)用戶新定義的數(shù)據(jù)類型,由它可以生成Person類的實(shí)例,C#語(yǔ)言叫對(duì)象。用如下方法聲明類的對(duì)象:Person OnePerson=new Person();此語(yǔ)句的意義是建立Person類對(duì)象,返回對(duì)象地址賦值給Person類變量OnePerson。也可以分兩步創(chuàng)建Person類的對(duì)象:Person OnePerson;OnePerson=new Person();OnePerson雖然存儲(chǔ)的是Person類對(duì)象地址,但不是C中的指針,不能象指針那樣可以進(jìn)行加減運(yùn)算,也不能轉(zhuǎn)換為其它類型地址,它是引用型變量,只能引用(代表)Person對(duì)象,具體意義參見(jiàn)

21、以后章節(jié)。和C、C+不同,C#只能用此種方法生成類對(duì)象。在程序中,可以用OnePerson.方法名或OnePerson.數(shù)據(jù)成員名訪問(wèn)對(duì)象的成員。例如:OnePerson.Display(),公用數(shù)據(jù)成員也可以這樣訪問(wèn)。注意,C#語(yǔ)言中不包括C+語(yǔ)言中的->符號(hào)。1.3.4 類的構(gòu)造函數(shù)和析構(gòu)函數(shù)在建立類的對(duì)象時(shí),需做一些初始化工作,例如對(duì)數(shù)據(jù)成員初始化。這些可以用構(gòu)造函數(shù)來(lái)完成。每當(dāng)用new生成類的對(duì)象時(shí),自動(dòng)調(diào)用類的構(gòu)造函數(shù)。終于明白了1 因此,可以把初始化的工作放到構(gòu)造函數(shù)中完成。構(gòu)造函數(shù)和類名相同,沒(méi)有返回值。例如可以定義Person類的構(gòu)造函數(shù)如下:public Person(

22、string Name,int Age)/類的構(gòu)造函數(shù),函數(shù)名和類同名,無(wú)返回值。 name=Name;age=Age;當(dāng)用Person OnePerson=new Person(“張五”,20)語(yǔ)句生成Person類對(duì)象時(shí),將自動(dòng)調(diào)用以上構(gòu)造函數(shù)。請(qǐng)注意如何把參數(shù)傳遞給構(gòu)造函數(shù)。變量和類的對(duì)象都有生命周期,生命周期結(jié)束,這些變量和對(duì)象就要被撤銷。類的對(duì)象被撤銷時(shí),將自動(dòng)調(diào)用析構(gòu)函數(shù)。一些善后工作可放在析構(gòu)函數(shù)中完成。析構(gòu)函數(shù)的名字為類名,無(wú)返回類型,也無(wú)參數(shù)。Person類的析構(gòu)函數(shù)為 Person()。C#中類析構(gòu)函數(shù)不能顯示地被調(diào)用,它是被垃圾收集器撤銷不被使用的對(duì)象時(shí)自動(dòng)調(diào)用的。1.3

23、.5 類的構(gòu)造函數(shù)的重載在C#語(yǔ)言中,同一個(gè)類中的函數(shù),如果函數(shù)名相同,而參數(shù)類型或個(gè)數(shù)不同,認(rèn)為是不同的函數(shù),這叫函數(shù)重載。僅返回值不同,不能看作不同的函數(shù)。這樣,可以在類定義中,定義多個(gè)構(gòu)造函數(shù),名字相同,參數(shù)類型或個(gè)數(shù)不同。根據(jù)生成類的對(duì)象方法不同,調(diào)用不同的構(gòu)造函數(shù)。例如可以定義Person類沒(méi)有參數(shù)的構(gòu)造函數(shù)如下:public Person()/類的構(gòu)造函數(shù),函數(shù)名和類同名,無(wú)返回值。 name="張三"age=12;用語(yǔ)句Person OnePerson=new Person("李四",30)生成對(duì)象時(shí),將調(diào)用有參數(shù)的構(gòu)造函數(shù),而用語(yǔ)句Per

24、son OnePerson=new Person()生成對(duì)象時(shí),調(diào)用無(wú)參數(shù)的構(gòu)造函數(shù)。由于析構(gòu)函數(shù)無(wú)參數(shù),因此,析構(gòu)函數(shù)不能重載。1.3.6 使用Person類的完整的例子下邊用一個(gè)完整的例子說(shuō)明Person類的使用:(VisualStudio.Net編譯通過(guò))using System;namespace e1/定義以下代碼所屬命名空間,意義見(jiàn)以后章節(jié) class Person private String name="張三"/類的數(shù)據(jù)成員聲明private int age=12;public void Display()/類的方法(函數(shù))聲明,顯示姓名和年齡 Consol

25、e.WriteLine("姓名:0,年齡:1",name,age);public void SetName(string PersonName)/指定修改姓名的方法(函數(shù)) name=PersonName;public void SetAge(int PersonAge)/指定修改年齡的方法(函數(shù)) age=PersonAge;public Person(string Name,int Age)/構(gòu)造函數(shù),函數(shù)名和類同名,無(wú)返回值 name=Name;age=Age;public Person()/類的構(gòu)造函數(shù)重載 name="田七"age=12;cla

26、ss Class1 static void Main(string args) Person OnePerson=new Person("李四",30);/生成類的對(duì)象OnePerson.Display();/下句錯(cuò)誤,在其它類(Class1類)中,不能直接修改Person類中的私有成員。/OneP="王五"/只能通過(guò)Person類中公有方法SetName修改Person類中的私有成員name。OnePerson.SetName("王五");OnePerson.SetAge(40);OnePerson.Displa

27、y();OnePerson=new Person();OnePerson.Display();鍵入CTRL+F5運(yùn)行后,顯示的效果是:姓名: 李四,年齡:30姓名: 王五,年齡:40姓名: 田七,年齡:121.4 C#的數(shù)據(jù)類型從大的方面來(lái)分,C#語(yǔ)言的數(shù)據(jù)類型可以分為三種:值類型,引用類型,指針類型,指針類型僅用于非安全代碼中。本節(jié)重點(diǎn)討論值類型和引用類型。1.4.1 值類型和引用類型區(qū)別在C#語(yǔ)言中,值類型變量存儲(chǔ)的是數(shù)據(jù)類型所代表的實(shí)際數(shù)據(jù),值類型變量的值(或?qū)嵗?存儲(chǔ)在棧(Stack)中,賦值語(yǔ)句是傳遞變量的值。引用類型(例如類就是引用類型)的實(shí)例,也叫對(duì)象,不存在棧中,而存儲(chǔ)在可管理

28、堆(Managed Heap)中,堆實(shí)際上是計(jì)算機(jī)系統(tǒng)中的空閑內(nèi)存。引用類型變量的值存儲(chǔ)在棧(Stack)中,但存儲(chǔ)的不是引用類型對(duì)象,而是存儲(chǔ)引用類型對(duì)象的引用,即地址,和指針?biāo)淼牡刂凡煌盟淼牡刂凡荒鼙恍薷模膊荒苻D(zhuǎn)換為其它類型地址,它是引用型變量,只能引用指定類對(duì)象,引用類型變量賦值語(yǔ)句是傳遞對(duì)象的地址。見(jiàn)下例:using System;class MyClass/類為引用類型 public int a=0;class Test static void Main() f1();static public void f1() int v1=1;/值類型變量v1,其值1存儲(chǔ)在棧(

29、Stack)中int v2=v1;/將v1的值(為1)傳遞給v2,v2=1,v1值不變。v2=2;/v2=2,v1值不變。MyClass r1=new MyClass();/引用變量r1存儲(chǔ)MyClass類對(duì)象的地址MyClass r2=r1;/r1和r2都代表是同一個(gè)MyClass類對(duì)象r2.a=2;/和語(yǔ)句r1.a=2等價(jià)存儲(chǔ)在棧中的變量,當(dāng)其生命周期結(jié)束,自動(dòng)被撤銷,例如,v1存儲(chǔ)在棧中,v1和函數(shù)f1同生命周期,退出函數(shù)f1,v1不存在了。但在堆中的對(duì)象不能自動(dòng)被撤銷。因此C和C+語(yǔ)言,在堆中建立的對(duì)象,不使用時(shí)必須用語(yǔ)句釋放對(duì)象占用的存儲(chǔ)空間。.NET系統(tǒng)CLR內(nèi)建垃圾收集器,當(dāng)對(duì)象

30、的引用變量被撤銷,表示對(duì)象的生命周期結(jié)束,垃圾收集器負(fù)責(zé)收回不被使用的對(duì)象占用的存儲(chǔ)空間。例如,上例中引用變量r1及r2是MyClass類對(duì)象的引用,存儲(chǔ)在棧中,退出函數(shù)f1,r1和r2都不存在了,在堆中的MyClass類對(duì)象也就被垃圾收集器撤銷。也就是說(shuō),CLR具有自動(dòng)內(nèi)存管理功能。終于明白了2 1.4.2 值類型變量分類C#語(yǔ)言值類型可以分為以下幾種:l 簡(jiǎn)單類型(Simple types)簡(jiǎn)單類型中包括:數(shù)值類型和布爾類型(bool)。數(shù)值類型又細(xì)分為:整數(shù)類型、字符類型(char)、浮點(diǎn)數(shù)類型和十進(jìn)制類型(decimal)。l 結(jié)構(gòu)類型(Struct types)l 枚舉類型(Enum

31、eration types)C#語(yǔ)言值類型變量無(wú)論如何定義,總是值類型變量,不會(huì)變?yōu)橐妙愋妥兞俊?.4.3 結(jié)構(gòu)類型結(jié)構(gòu)類型和類一樣,可以聲明構(gòu)造函數(shù)、數(shù)據(jù)成員、方法、屬性等。結(jié)構(gòu)和類的最根本的區(qū)別是結(jié)構(gòu)是值類型,類是引用類型。和類不同,結(jié)構(gòu)不能從另外一個(gè)結(jié)構(gòu)或者類派生,本身也不能被繼承,因此不能定義抽象結(jié)構(gòu),結(jié)構(gòu)成員也不能被訪問(wèn)權(quán)限控制字protected修飾,也不能用virtual和abstract修飾結(jié)構(gòu)方法。在結(jié)構(gòu)中不能定義析構(gòu)函數(shù)。雖然結(jié)構(gòu)不能從類和結(jié)構(gòu)派生,可是結(jié)構(gòu)能夠繼承接口,結(jié)構(gòu)繼承接口的方法和類繼承接口的方法基本一致。下面例子定義一個(gè)點(diǎn)結(jié)構(gòu)point:using Syste

32、m;struct point/結(jié)構(gòu)定義 public int x,y;/結(jié)構(gòu)中也可以聲明構(gòu)造函數(shù)和方法,變量不能賦初值class Test static void Main() point P1;P1.x=166;P1.y=111;point P2;P2=P1;/值傳遞,使P2.x=166,P2.y=111point P3=new point();/用new生成結(jié)構(gòu)變量P3,P3仍為值類型變量/用new生成結(jié)構(gòu)變量P3僅表示調(diào)用默認(rèn)構(gòu)造函數(shù),使x=y=0。1.4.4 簡(jiǎn)單類型簡(jiǎn)單類型也是結(jié)構(gòu)類型,因此有構(gòu)造函數(shù)、數(shù)據(jù)成員、方法、屬性等,因此下列語(yǔ)句int i=int.MaxValue;stri

33、ng s=i.ToString()是正確的。即使一個(gè)常量,C#也會(huì)生成結(jié)構(gòu)類型的實(shí)例,因此也可以使用結(jié)構(gòu)類型的方法,例如:string s=13.ToString()是正確的。簡(jiǎn)單類型包括:整數(shù)類型、字符類型、布爾類型、浮點(diǎn)數(shù)類型、十進(jìn)制類型。見(jiàn)下表:保留字System命名空間中的名字字節(jié)數(shù)取值范圍sbyteSystem.Sbyte1-128127byteSystem.Byte10255shortSystem.Int162-3276832767ushortSystem.UInt162065535intSystem.Int324-21474836482147483647uintSystem.UI

34、nt32404292967295longSystem.Int648-92233720368547758089223372036854775808ulongSystem.UInt648018446744073709551615charSystem.Char2065535floatSystem.Single43.4E-383.4E+38doubleSystem.Double81.7E-3081.7E+308boolSystem.Boolean (true,false)decimalSystem.Decimal16正負(fù) 1.0×10-28 到7.9×1028之間C#簡(jiǎn)單類型使用方

35、法和C、C+中相應(yīng)的數(shù)據(jù)類型基本一致。需要注意的是:l 和C語(yǔ)言不同,無(wú)論在何種系統(tǒng)中,C#每種數(shù)據(jù)類型所占字節(jié)數(shù)是一定的。l 字符類型采用Unicode字符集,一個(gè)Unicode標(biāo)準(zhǔn)字符長(zhǎng)度為16位。l 整數(shù)類型不能隱式被轉(zhuǎn)換為字符類型(char),例如char c1=10是錯(cuò)誤的,必須寫成:char c1=(char)10,char c='A',char c='x0032'char c='u0032'。l 布爾類型有兩個(gè)值:false,true。不能認(rèn)為整數(shù)0是false,其它值是true。bool x=1是錯(cuò)誤的,不存在這種寫法,只能寫成x

36、=true 或x=false。l 十進(jìn)制類型(decimal)也是浮點(diǎn)數(shù)類型,只是精度比較高,一般用于財(cái)政金融計(jì)算。1.4.5 枚舉類型C#枚舉類型使用方法和C、C+中的枚舉類型基本一致。見(jiàn)下例:using System;class Class1 enum Days Sat=1, Sun, Mon, Tue, Wed, Thu, Fri; /使用Visual Studio.Net,enum語(yǔ)句添加在STAThread前邊 static void Main(string args) Days day=Days.Tue; int x=(int)Days.Tue;/x=2 Console.Write

37、Line("day=0,x=1",day,x);/顯示結(jié)果為:day=Tue,x=4 在此枚舉類型Days中,每個(gè)元素的默認(rèn)類型為int,其中Sun=0,Mon=1,Tue=2,依此類推。也可以直接給枚舉元素賦值。例如:enum DaysSat=1,Sun,Mon,Tue,Wed,Thu,Fri,Sat;終于明白了3 在此枚舉中,Sun=1,Mon=2,Tue=3,Wed=4,等等。和C、C+中不同,C#枚舉元素類型可以是byte、sbyte、short、ushort、int、uint、long和ulong類型,但不能是char類型。見(jiàn)下例:enum Days:byteSu

38、n,Mon,Tue,Wed,Thu,Fri,Sat;/元素為字節(jié)類型1.4.6 值類型的初值和默認(rèn)構(gòu)造函數(shù)所有變量都要求必須有初值,如沒(méi)有賦值,采用默認(rèn)值。對(duì)于簡(jiǎn)單類型,sbyte、byte、short、ushort、int、uint、long和ulong默認(rèn)值為0,char類型默認(rèn)值是(char)0,float為0.0f,double為0.0d,decimal為0.0m,bool為false,枚舉類型為0,在結(jié)構(gòu)類型和類中,數(shù)據(jù)成員的數(shù)值類型變量設(shè)置為默認(rèn)值,引用類型變量設(shè)置為null??梢燥@示的賦值,例如int i=0。而對(duì)于復(fù)雜結(jié)構(gòu)類型,其中的每個(gè)數(shù)據(jù)成員都按此種方法賦值,顯得過(guò)于麻煩。

39、由于數(shù)值類型都是結(jié)構(gòu)類型,可用new語(yǔ)句調(diào)用其構(gòu)造函數(shù)初始化數(shù)值類型變量,例如:int j=new int()。請(qǐng)注意,用new語(yǔ)句并不是把int變量變?yōu)橐米兞浚琷仍是值類型變量,這里new僅僅是調(diào)用其構(gòu)造函數(shù)。所有的數(shù)值類型都有默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù),其功能就是為該數(shù)值類型賦初值為默認(rèn)值。對(duì)于自定義結(jié)構(gòu)類型,由于已有默認(rèn)的無(wú)參數(shù)的構(gòu)造函數(shù),不能再定義無(wú)參數(shù)的構(gòu)造函數(shù),但可以定義有參數(shù)的構(gòu)造函數(shù)。1.4.7 引用類型分類C#語(yǔ)言中引用類型可以分為以下幾種:l 類:C#語(yǔ)言中預(yù)定義了一些類:對(duì)象類(object類)、數(shù)組類、字符串類等。當(dāng)然,程序員可以定義其它類。l 接口。l 代表。C#語(yǔ)言引

40、用類型變量無(wú)論如何定義,總是引用類型變量,不會(huì)變?yōu)橹殿愋妥兞?。C#語(yǔ)言引用類型對(duì)象一般用運(yùn)算符new建立,用引用類型變量引用該對(duì)象。本節(jié)僅介紹對(duì)象類型(object類型)、字符串類型、數(shù)組。其它類型在其它節(jié)中介紹。1.4.8 對(duì)象類(object類)C#中的所有類型(包括數(shù)值類型)都直接或間接地以object類為基類。對(duì)象類(object類)是所有其它類的基類。任何一個(gè)類定義,如果不指定基類,默認(rèn)object為基類。繼承和基類的概念見(jiàn)以后章節(jié)。C#語(yǔ)言規(guī)定,基類的引用變量可以引用派生類的對(duì)象(注意,派生類的引用變量不可以引用基類的對(duì)象),因此,對(duì)一個(gè)object的變量可以賦予任何類型的值:in

41、t x =25;object obj1;obj1=x;object obj2= 'A'object關(guān)鍵字是在命名空間System中定義的,是類System.Object的別名。1.4.9 數(shù)組類在進(jìn)行批量處理數(shù)據(jù)的時(shí)候,要用到數(shù)組。數(shù)組是一組類型相同的有序數(shù)據(jù)。數(shù)組按照數(shù)組名、數(shù)據(jù)元素的類型和維數(shù)來(lái)進(jìn)行描述。C#語(yǔ)言中數(shù)組是類System.Array類對(duì)象,比如聲明一個(gè)整型數(shù)數(shù)組:int arr=new int5;實(shí)際上生成了一個(gè)數(shù)組類對(duì)象,arr是這個(gè)對(duì)象的引用(地址)。在C#中數(shù)組可以是一維的也可以是多維的,同樣也支持?jǐn)?shù)組的數(shù)組,即數(shù)組的元素還是數(shù)組。一維數(shù)組最為普遍,用的

42、也最多。我們先看一個(gè)一維數(shù)組的例子:using System;class Test static void Main() int arr=new int3;/用new運(yùn)算符建立一個(gè)3個(gè)元素的一維數(shù)組for(int i=0;i<arr.Length;i+)/arr.Length是數(shù)組類變量,表示數(shù)組元素個(gè)數(shù)arri=i*i;/數(shù)組元素賦初值,arri表示第i個(gè)元素的值for (int i=0;i<arr.Length;i+)/數(shù)組第一個(gè)元素的下標(biāo)為0Console.WriteLine("arr0=1",i,arri);這個(gè)程序創(chuàng)建了一個(gè)int類型3個(gè)元素的一維數(shù)組

43、,初始化后逐項(xiàng)輸出。其中arr.Length表示數(shù)組元素的個(gè)數(shù)。注意數(shù)組定義不能寫為C語(yǔ)言格式:int arr。程序的輸出為:arr0 = 0arr1 = 1arr2 = 4上面的例子中使用的是一維數(shù)組,下面介紹多維數(shù)組:string a1;/一維string數(shù)組類引用變量a1string, a2;/二維string數(shù)組類引用變量a2a2=new string2,3;a21,2="abc"string, a3;/三維string數(shù)組類引用變量a3string j2;/數(shù)組的數(shù)組,即數(shù)組的元素還是數(shù)組string j3;在數(shù)組聲明的時(shí)候,可以對(duì)數(shù)組元素進(jìn)行賦值??聪旅娴睦樱?/p>

44、int a1=new int1,2,3;/一維數(shù)組,有3個(gè)元素。int a2=new int31,2,3;/此格式也正確int a3=1,2,3;/相當(dāng)于int a3=new int1,2,3;int, a4=new int,1,2,3,4,5,6;/二維數(shù)組,a41,1=5int j2=new int3;/定義數(shù)組j2,有三個(gè)元素,每個(gè)元素都是一個(gè)數(shù)組j20=new int1,2,3;/定義第一個(gè)元素,是一個(gè)數(shù)組j21=new int1, 2, 3, 4, 5, 6;/每個(gè)元素的數(shù)組可以不等長(zhǎng)j22=new int1, 2, 3, 4, 5, 6, 7, 8, 9;1.4.10 字符串類(s

45、tring類)C#還定義了一個(gè)基本的類string,專門用于對(duì)字符串的操作。這個(gè)類也是在名字空間System中定義的,是類System.String的別名。字符串應(yīng)用非常廣泛,在string類的定義中封裝了許多方法,下面的一些語(yǔ)句展示了string類的一些典型用法:l 字符串定義string s;/定義一個(gè)字符串引用類型變量ss="Zhang"/字符串引用類型變量s指向字符串"Zhang"string FirstName="Ming"string LastName="Zhang"string Name=FirstN

46、ame+" "+LastName;/運(yùn)算符+已被重載string SameName=Name;char s2='計(jì)','算','機(jī)','科','學(xué)'string s3=new String(s2);l 字符串搜索string s="ABC科學(xué)"int i=s.IndexOf("科");搜索"科"在字符串中的位置,因第一個(gè)字符索引為0,所以"A"索引為0,"科"索引為3,因此這里i=3,如沒(méi)有此字符

47、串i=-1。注意C#中,ASCII和漢字都用2字節(jié)表示。l 字符串比較函數(shù)string s1="abc"string s2="abc"int n=string.Compare(s1,s2);/n=0n=0表示兩個(gè)字符串相同,n小于零,s1<s2,n大于零,s1>s2。此方法區(qū)分大小寫。也可用如下辦法比較字符串:string s1="abc"string s="abc"string s2="不相同"if(s=s1)/還可用!=。雖然String是引用類型,但這里比較兩個(gè)字符串的值s2=

48、"相同"l 判斷是否為空字符串string s=""string s1="不空"if(s.Length=0)s1="空"l 得到子字符串或字符string s="取子字符串"string sb=s.Substring(2,2);/從索引為2開(kāi)始取2個(gè)字符,Sb="字符",s內(nèi)容不變char sb1=s0;/sb1='取'Console.WriteLine(sb1);/顯示:取l 字符串刪除函數(shù)string s="取子字符串"string s

49、b=s.Remove(0,2);/從索引為0開(kāi)始刪除2個(gè)字符,Sb="字符串",s內(nèi)容不變l 插入字符串string s="計(jì)算機(jī)科學(xué)"string s1=s.Insert(3,"軟件");/s1="計(jì)算機(jī)軟件科學(xué)",s內(nèi)容不變l 字符串替換函數(shù)string s="計(jì)算機(jī)科學(xué)"string s1=s.Replace("計(jì)算機(jī)","軟件");/s1="軟件科學(xué)",s內(nèi)容不變l 把String轉(zhuǎn)換為字符數(shù)組string S="計(jì)算

50、機(jī)科學(xué)"char s2=S.ToCharArray(0,S.Length);/屬性Length為字符類對(duì)象的長(zhǎng)度l 其它數(shù)據(jù)類型轉(zhuǎn)換為字符串int i=9;string s8=i.ToString();/s8="9"float n=1.9f;string s9=n.ToString();/s8="1.9"其它數(shù)據(jù)類型都可用此方法轉(zhuǎn)換為字符類對(duì)象l 大小寫轉(zhuǎn)換string s="AaBbCc"string s1=s.ToLower();/把字符轉(zhuǎn)換為小寫,s內(nèi)容不變string s2=s.ToUpper();/把字符轉(zhuǎn)換為大寫

51、,s內(nèi)容不變l 刪除所有的空格string s="A bc "s.Trim();/刪除所有的空格string類其它方法的使用請(qǐng)用幫助系統(tǒng)查看,方法是打開(kāi)Visual Studio.Net的代碼編輯器,鍵入string,將光標(biāo)移到鍵入的字符串string上,然后按F1鍵。1.4.11 類型轉(zhuǎn)換在編寫C#語(yǔ)言程序中,經(jīng)常會(huì)碰到類型轉(zhuǎn)換問(wèn)題。例如整型數(shù)和浮點(diǎn)數(shù)相加,C#會(huì)進(jìn)行隱式轉(zhuǎn)換。詳細(xì)記住那些類型數(shù)據(jù)可以轉(zhuǎn)換為其它類型數(shù)據(jù),是不可能的,也是不必要的。程序員應(yīng)記住類型轉(zhuǎn)換的一些基本原則,編譯器在轉(zhuǎn)換發(fā)生問(wèn)題時(shí),會(huì)給出提示。C#語(yǔ)言中類型轉(zhuǎn)換分為:隱式轉(zhuǎn)換、顯示轉(zhuǎn)換、加框(box

52、ing)和消框(unboxing)等三種。一隱式轉(zhuǎn)換隱式轉(zhuǎn)換就是系統(tǒng)默認(rèn)的、不需要加以聲明就可以進(jìn)行的轉(zhuǎn)換。例如從int類型轉(zhuǎn)換到long類型就是一種隱式轉(zhuǎn)換。在隱式轉(zhuǎn)換過(guò)程中,轉(zhuǎn)換一般不會(huì)失敗,轉(zhuǎn)換過(guò)程中也不會(huì)導(dǎo)致信息丟失。例如:int i=10;long l=i;二顯示轉(zhuǎn)換顯式類型轉(zhuǎn)換,又叫強(qiáng)制類型轉(zhuǎn)換。與隱式轉(zhuǎn)換正好相反,顯式轉(zhuǎn)換需要明確地指定轉(zhuǎn)換類型,顯示轉(zhuǎn)換可能導(dǎo)致信息丟失。下面的例子把長(zhǎng)整形變量顯式轉(zhuǎn)換為整型:long l=5000;int i=(int)l;/如果超過(guò)int取值范圍,將產(chǎn)生異常三加框(boxing)和消框(unboxing)加框(boxing)和消框(unboxing)是C#語(yǔ)言類型系統(tǒng)提出的核心概念,加框是值類型轉(zhuǎn)換為obje

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論