《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件002_第1頁(yè)
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件002_第2頁(yè)
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件002_第3頁(yè)
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件002_第4頁(yè)
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件002_第5頁(yè)
已閱讀5頁(yè),還剩196頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第2章C#基礎(chǔ)知識(shí)2.1聲明C#中的變量和常量

2.2C#中數(shù)據(jù)類型的分類 2.3裝箱和拆箱

2.4C#中的運(yùn)算符與表達(dá)式2.5C#中的選擇語(yǔ)句

2.6C#中的循環(huán)語(yǔ)句

2.7數(shù)組、結(jié)構(gòu)和枚舉

2.8綜合案例:冒泡排序

本章小結(jié)

練習(xí)與作業(yè)

上機(jī)部分(二) 學(xué)習(xí)目標(biāo)●掌握在C#?中定義變量和常量●掌握C#?中的基本數(shù)據(jù)類型●理解裝箱和拆箱的概念●掌握C#?中的運(yùn)算符和表達(dá)式●掌握C#?中的選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)●學(xué)會(huì)定義和使用數(shù)組,了解結(jié)構(gòu)和枚舉2.1聲明C#?中的變量和常量2.1.1變量變量是在程序運(yùn)行過程中其值可以改變的量,它是一個(gè)已命名的存儲(chǔ)單元,通常用來記錄運(yùn)算中間結(jié)果或保存數(shù)據(jù)。在C#?中,每個(gè)變量都具有一個(gè)類型,它確定哪些值可以存儲(chǔ)在該變量中,變量的值可以通過賦值和運(yùn)算等操作來改變。使用變量有一條十分重要的原則:先定義,后使用,變量可以在定義時(shí)賦值,也可以在定義之后通過賦值語(yǔ)句賦值。另外,在一個(gè)程序中只能對(duì)一個(gè)變量定義一次。變量聲明格式:

[訪問修飾符]數(shù)據(jù)類型變量名稱[=初始值];

例如:

intage=8; //年齡一般用整型表示

stringname; //姓名一般用字符串類型也可以同時(shí)聲明一個(gè)或多個(gè)給定類型的變量,例如:

inta=1,b=2,c=3;

下面從變量的命名和變量類型來理解變量。

1.命名變量

C#代碼中使用的每一個(gè)變量都必須有一個(gè)名稱。為變量起名的時(shí)候要遵循C#?語(yǔ)言的規(guī)定:

(1)變量名必須是由字母和數(shù)字組成的字符串,長(zhǎng)度沒有限制,但首字符必須為字母、下劃線或@,其后的字符可以是字母、數(shù)字、下劃線。(2)變量名不能使用C#中的關(guān)鍵字(見表2-1)和庫(kù)函數(shù)名稱,如果一定要用C#語(yǔ)言中的關(guān)鍵字或庫(kù)函數(shù)名稱作為變量名,應(yīng)使用“@”字符作為前綴。

(3)變量名嚴(yán)格區(qū)分字母大小寫。合法變量名與不合法變量名舉例:

inti; //合法

intno.1; //不合法,含有不允許的字符

stringname; //合法

charuse; //不合法,含有關(guān)鍵字

char@use; //合法

shortmain; //不合法,與main函數(shù)同名

_debug; //合法

關(guān)鍵字(KeyWords),又叫保留字,是C#編譯器本身使用的特定符號(hào)串,每個(gè)關(guān)鍵字都有它的意義,程序設(shè)計(jì)者只能根據(jù)該意義加以使用,不能重新定義,因此變量名不能使用關(guān)鍵字,以免發(fā)生錯(cuò)誤。C#語(yǔ)言的關(guān)鍵字如表2-1所示。表2-1C#中的關(guān)鍵字注意:●在給變量取名時(shí)盡量使用有意義的名稱?!窨梢栽谝粭l語(yǔ)句中命名多個(gè)變量,例如:inta,b,c=5,d?!褡兞渴菂^(qū)分大小寫的,即大小寫含義不同,如說明變量X和x是不同的,rose、Rose和ROSE是三個(gè)不同的變量。下面通過例2-1演示如何在C#程序中聲明變量。

【例2-1】

建立一個(gè)控制臺(tái)應(yīng)用程序,在程序中聲明變量,并將聲明的變量輸出。步驟:

(1)啟動(dòng)VisualStudio.NET,界面如圖2-1所示。圖2-1啟動(dòng)界面(2)單擊【新建項(xiàng)目】按鈕,打開“新建項(xiàng)目”對(duì)話框,項(xiàng)目類型選擇“VisualC#”,模板選擇“控制臺(tái)應(yīng)用程序”,名稱填寫“Demo2-1”,選擇相應(yīng)的存儲(chǔ)位置。界面如圖2-2所示。

(3)進(jìn)入VS.NET控制臺(tái)應(yīng)用程序設(shè)計(jì)的主界面,如圖2-3所示。圖2-2新建項(xiàng)目圖2-3控制臺(tái)程序設(shè)計(jì)的主界面(4)在代碼設(shè)計(jì)窗口中編輯class1.cs。在其中的Main(string[]args)函數(shù)體內(nèi)寫下列代碼:

staticvoidMain(string[]args) { booltest=true; //聲明布爾型

stringstr="Hello"; //聲明字符串型

intnum=100; //聲明整型

//輸出各變量的值

Console.WriteLine("布爾型變量的值="+test); Console.WriteLine("字符串型變量的值="+str); Console.WriteLine("整型變量的值={0}",num); }(5)選擇“調(diào)試”→“開始執(zhí)行(不調(diào)試)”選項(xiàng)來執(zhí)行此應(yīng)用程序。

(6)程序運(yùn)行結(jié)果如圖2-4所示。圖2-4例2-1運(yùn)行結(jié)果2.變量的類型在C#語(yǔ)言中,把變量分為七種類型,它們分別是:靜態(tài)變量、非靜態(tài)變量、數(shù)組元素、值類型、引用參數(shù)、輸出參數(shù)和局部變量,看下面的例子。

classA{publicstaticintx;inty;voidF(int[]v,inta,refintb,outintc){inti=1;c=a+b++;}}

在上面的變量聲明中,x是靜態(tài)變量,y是非靜態(tài)變量,v[0]是數(shù)組元素,i是局部變量,a是值參數(shù),b是引用參數(shù),c是輸出參數(shù)。1)靜態(tài)變量帶有static修飾符聲明的變量稱為靜態(tài)變量。一旦靜態(tài)變量所屬的類被裝載,直到包含該類的程序運(yùn)行結(jié)束,它將一直存在。靜態(tài)變量的初始值就是該變量類型的默認(rèn)值。為了便于定義賦值檢查,靜態(tài)變量最好是在定義時(shí)賦值。如:

staticinta=10;

2)非靜態(tài)變量不帶有static修飾符聲明的變量稱為實(shí)例變量。如:

inta;針對(duì)類中的非靜態(tài)變量而言,一旦一個(gè)類的新的實(shí)例被創(chuàng)建,直到該實(shí)例不再被應(yīng)用從而所在空間被釋放為止,該非靜態(tài)變量將一直存在。同樣鑒于定義賦值檢查,一個(gè)類的非靜態(tài)變量也應(yīng)該在初始化時(shí)賦值。

結(jié)構(gòu)中的非靜態(tài)變量隨著結(jié)構(gòu)的存在而存在。也就是說,當(dāng)一個(gè)結(jié)構(gòu)類型的變量存在或結(jié)束時(shí),該結(jié)構(gòu)類型中的變量也隨之存在和結(jié)束。同樣的結(jié)構(gòu)中的實(shí)例變量會(huì)隨著結(jié)構(gòu)類型變量的初始化而被初始化,如果該結(jié)構(gòu)類型變量定義時(shí)未被賦值,那么其中的實(shí)例變量也不會(huì)被賦值。

3)數(shù)組元素?cái)?shù)組元素也是變量的一種,該變量隨該數(shù)組實(shí)例的存在而存在。每一個(gè)數(shù)組元素的初始值是該數(shù)組元素類型的默認(rèn)值。同樣鑒于定義賦值檢查,數(shù)組元素最好在初始時(shí)被賦值。4)局部變量局部變量是指在一個(gè)獨(dú)立的程序塊、一個(gè)for語(yǔ)句、switch語(yǔ)句,或者using語(yǔ)句中聲明的變量,它只在該范圍中有效。當(dāng)程序運(yùn)行到這一范圍時(shí),該變量即開始生效,程序離開時(shí)變量就失效了。與其他幾種變量類型不同的是,局部變量不會(huì)自動(dòng)被初始化,所以也就沒有默認(rèn)值。在進(jìn)行賦值檢查的時(shí)候,局部變量被認(rèn)為沒有被賦值。在局部變量的有效范圍內(nèi),在變量的定義以前就使用是不合法的,比如:

for(inti=0;i<10;i++){intnum=a; //非法,因?yàn)榫植孔兞縜還沒有定義

inta;intb=a; //正確

}5)值參數(shù)當(dāng)利用值向方法傳遞參數(shù)時(shí),編譯程序給實(shí)參的值做一份副本,并且將此副本傳遞給該方法。被調(diào)用的方法不會(huì)修改內(nèi)存中實(shí)參的值,所以使用值傳遞時(shí),可以保證實(shí)際值是安全的。在調(diào)用方法時(shí),如果形式化參數(shù)的類型是值參數(shù)的話,調(diào)用的實(shí)參的表達(dá)式必須保證是正確的表達(dá)式。

6)引用參數(shù)和值參數(shù)不同的是,引用參數(shù)并不開辟新的內(nèi)存區(qū)域。當(dāng)利用引用參數(shù)向方法傳遞行參時(shí),編譯程序把實(shí)際值在內(nèi)存中的地址傳遞給方法。7)輸出參數(shù)與引用參數(shù)類似,輸出參數(shù)也不開辟新的內(nèi)存區(qū)域。與引用參數(shù)的差別在于,調(diào)用方法前需對(duì)變量進(jìn)行初始化。輸出參數(shù)用于傳遞方法返回的數(shù)據(jù)。

Out修飾符后跟隨與形參的類型相同的類型聲明。在方法返回后,傳遞的變量被認(rèn)為經(jīng)過了初始化。2.1.2C#?中的常量常量就是在程序執(zhí)行中其值保持固定不變的量。常量通??梢苑譃橹苯映A亢头?hào)常量。從數(shù)據(jù)類型角度來看,常量的類型可以是任何一種值類型或引用類型。

直接常量是指把程序中不變的量直接編碼為數(shù)值或字符串值。

(1)整數(shù)常量。

123 //int類型直接常量

32L //long類型直接常量

0x20 //十六進(jìn)制的20(2)浮點(diǎn)常量。

//float類型直接常量

0.16d //double類型直接常量

(3)字符常量:用單引號(hào)括起的單個(gè)字符?!瓵’ //字符直接常量

(4)字符串常量:用雙引號(hào)括起來的零個(gè)或多個(gè)字符序列。

"Hello,World." //字符串直接常量(5)布爾常量。它只有兩個(gè)值True和False。符號(hào)常量是經(jīng)過聲明的常量,包括常量的名稱和它的值。常量聲明的格式如下:

[訪問修飾符]Const數(shù)據(jù)類型常量名=初始值;例如:

constdoublePI=3.1415926; publicconstfloatE=2.718;和變量一樣,可以同時(shí)聲明一個(gè)或多個(gè)給定類型的常量,例如:

constinta=1,b=2,c=3;

注意:符號(hào)常量必須在聲明時(shí)賦初始值,一旦初始化,就不能修改了,否則會(huì)出現(xiàn)編譯錯(cuò)誤?!纠?-2】計(jì)算鐘擺周期。新建一個(gè)名為“Demo2-2”的控制臺(tái)應(yīng)用程序,將下列代碼添加到Program.cs中:

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_2{classProgram{staticvoidMain(string[]args) { //PI常量PI constfloat_pi=3.14F; //由地球引力引起的加速度常量,單位為cm/s*s

constfloat_gravity=980; //鐘擺的長(zhǎng)度

intlength=40; //鐘擺的周期

doubleperiod=0; //鐘擺周期的計(jì)算公式

period=2*_pi*Math.Sqrt(length/_gravity); Console.WriteLine("鐘擺的周期為{0}秒",period); } }}

說明:在計(jì)算鐘擺周期公式中使用了兩個(gè)常量:PI和地球引力引起的加速度(g),在程序中分別聲明為_pi和_gravity,數(shù)據(jù)類型為float型。在示例中的程序用Math類的Sqrt()方法計(jì)算平方根。程序運(yùn)行結(jié)果如圖2-5所示。圖2-5例2-2運(yùn)行結(jié)果2.2C#?中數(shù)據(jù)類型的分類

C#?中的數(shù)據(jù)類型分為兩種基本類型:值類型和引用類型。值類型指的是那些能夠直接賦值的變量類型,引用類型則是函數(shù)或方法中定義的接口變量,用以訪問內(nèi)部數(shù)據(jù)。從面向?qū)ο蟮慕嵌葋砜紤],引用類型支持?jǐn)?shù)據(jù)的隱藏,而值類型不支持。數(shù)據(jù)類型的分類如圖2-6所示。圖2-6數(shù)據(jù)類型的分類2.2.1值類型

所謂值類型就是一個(gè)包含實(shí)際數(shù)據(jù)的量。值類型在棧中存儲(chǔ)它的值,這與C++中的變量類似,當(dāng)傳遞一個(gè)值類型的變量時(shí),就是傳遞該變量的值而不是傳遞它的基礎(chǔ)對(duì)象的引用。值類型包括基本類型、結(jié)構(gòu)類型、枚舉類型。1.基本類型基本類型有時(shí)也稱為內(nèi)置數(shù)據(jù)類型,是C#語(yǔ)言中提供的、無法再分解的一種具體類型。它可以分為:整數(shù)類型、字符類型、布爾類型和實(shí)數(shù)類型。

1)整數(shù)類型整數(shù)類型的變量的值為整數(shù)。在計(jì)算機(jī)語(yǔ)言提供的整數(shù)類型的值是在一定的范圍之內(nèi)。C#中整數(shù)類型有8種:字節(jié)型(sbyte)、無符號(hào)字節(jié)型(byte)、短整型(short)、無符號(hào)短整型(ushort)、整型(int)、無符號(hào)整型(uint)、長(zhǎng)整型(long)、無符號(hào)長(zhǎng)整型(ulong),具體各整數(shù)類型及其取值范圍如表2-2所示。

2)實(shí)數(shù)類型

C#語(yǔ)言中實(shí)數(shù)類型包括單精度浮點(diǎn)型(float)、雙精度浮點(diǎn)型(double)和十進(jìn)制類型(decimal)。它們的差別主要在于取值范圍和精度不同。具體各實(shí)數(shù)類型及其取值范圍與精度如表2-3所示。表2-2整數(shù)類型及其取值范圍數(shù)據(jù)類型別名特征取值范圍示例sbyteSystem.sbyte8位有符號(hào)整型-128~127sbytesb=11;byteSystem.byte8位無符號(hào)整型0~255bytesb=11;shortS1616位有符號(hào)整型-32?768~32?767shortsb=1119ushortSystem.uint1616位無符號(hào)整型0~65535ushortsb=11;intS3232位有符號(hào)整型-2147483648~2147483647intsb=11;uintSystem.uint3232位無符號(hào)整型0~4294967295uintsb=510;longS6464位有符號(hào)整型-9223372036854775808~9223372036854775807longsb=102l;ulongSystem.uint6464位無符號(hào)整型0~18446744073709551615ulongsb=1025u表2-3實(shí)數(shù)類型及其取值范圍3)字符類型

C#提供的字符類型按照國(guó)際上公認(rèn)的標(biāo)準(zhǔn),采用Unicode字符集。一個(gè)Unicode字符的長(zhǎng)度為16位(bit),它可以用來表示世界上大部分的語(yǔ)言種類??梢园凑障旅娴姆绞浇o字符變量賦值:

charch='H'; //Hcharcx='X'; //X

另外,還可以直接通過十六進(jìn)制轉(zhuǎn)義符(以\x開始)或Unicode表示法(以\u開始)給字符變量賦值,如:charch1='\x0048'; //Hcharcx1='\x0058'; //Xcharch2='\u0048'; //Hcharcx2='\u0058'; //X

另外,在C#?中,Java和C++等一樣仍然存在轉(zhuǎn)義符,用以在程序中指代特殊的控制字符,如表2-4所示。表2-4C#中常用的轉(zhuǎn)義符2.枚舉類型枚舉(enum)實(shí)際上是為一組邏輯上密不可分的數(shù)值提供一個(gè)便于記憶的符號(hào),該類型變量的值只限于列舉出來的值的范圍內(nèi)。

3.結(jié)構(gòu)類型在實(shí)際生活中,我們通常將相關(guān)的一些數(shù)據(jù)作為一個(gè)整體來處理。例如,一個(gè)學(xué)生的學(xué)號(hào)、性別、年齡和成績(jī)等,我們需要把這些數(shù)據(jù)組合起來。在這個(gè)組合中可以包含若干個(gè)類型不同(也可以相同)的數(shù)據(jù)項(xiàng)(如學(xué)生、性別、年齡、成績(jī)等)。在C#中實(shí)現(xiàn)這一功能的數(shù)據(jù)類型是結(jié)構(gòu)類型,可以把一些變量作為結(jié)構(gòu)類型數(shù)據(jù)的成員,它們統(tǒng)一于所組成的結(jié)構(gòu)。2.2.2引用類型引用類型也稱為參考類型。該類型變量不直接存儲(chǔ)所包含的值。而是指向它所要存儲(chǔ)的值。也就是說,引用類型所存儲(chǔ)的實(shí)際數(shù)據(jù)是當(dāng)前引用值的地址,因此引用類型變量的值會(huì)跟隨所指向的值的變化而變化。這與簡(jiǎn)單數(shù)據(jù)類型是不同的:簡(jiǎn)單數(shù)據(jù)類型存儲(chǔ)的是自身的值,而引用類型是將自身的值直接指向到某個(gè)對(duì)象的值,它就像一面鏡子一樣,雖然從鏡子中看到了物體,但物體并不存在于鏡子中,它只不過是將物體反射過來罷了。

C#中的引用類型主要有四種:類、委托、數(shù)組和接口。1.類類是面向?qū)ο缶幊痰幕締挝?,是一種包含數(shù)據(jù)成員、數(shù)據(jù)函數(shù)和嵌套類型的數(shù)據(jù)結(jié)構(gòu)。類的數(shù)據(jù)成員有常量、字段和事件。函數(shù)成員包括方法、屬性、索引指示器、運(yùn)算符、構(gòu)造函數(shù)和析構(gòu)函數(shù)。類支持繼承機(jī)制,通過繼承,派生類可以擴(kuò)展類的數(shù)據(jù)成員和函數(shù)方法,進(jìn)而達(dá)到代碼重用和設(shè)計(jì)重用的目的。下面先來看看類的定義與使用,類需要使用class關(guān)鍵字進(jìn)行聲明,請(qǐng)看下面的例子?!纠?-3】

類的定義與使用。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_3{classPerson{//類的成員

privatestringname;//類的屬性

publicstringName{get{returnname;}set{name=value;}}//類的構(gòu)造函數(shù),即初始化函數(shù),將類的成員初始化//如果構(gòu)造函數(shù)有參數(shù),則在引用該類時(shí)必須給出該參數(shù)的值,否則無法創(chuàng)建該類publicPerson(){name="test";}//類的方法

publicvoidClearValue(){name=null;}classUserPerson{//定義程序入口

publicstaticvoidMain(){Personp=newPerson(); //引用類

Console.WriteLine("1:"+p.Name);p.Name="Zhangsan"; //訪問類的屬性

Console.WriteLine("2:"+p.Name);p.ClearValue(); //訪問類的方法

Console.WriteLine("3:"+p.Name);}}}}

說明:上面的程序定義了兩個(gè)類:一個(gè)是Person,它包含數(shù)據(jù)成員name、屬性Name、構(gòu)造函數(shù)Person、方法ClearValue;另一個(gè)是UserPerson,這個(gè)類是為了檢測(cè)類Person是否能正常工作而建立的,類中定義了Main方法,因此是可以執(zhí)行的,該方法中引入了所聲明的類Person,并對(duì)類的屬性、方法進(jìn)行訪問。程序在運(yùn)行過程中先由構(gòu)造函數(shù)將name的值初始化為test,然后通過對(duì)屬性Name的修改使其值為Zhangsan,最后使用ClearValue方法將name的值清除,因此,程序的運(yùn)行結(jié)果如圖2-7所示。圖2-7例2-3運(yùn)行結(jié)果2.委托委托(delegate)也稱代表。它實(shí)際上相當(dāng)于C#函數(shù)中的指針原型,與指針不同的是,委托是安全的,而使用指針的時(shí)候必須聲明代碼是“非安全的”。在聲明委托時(shí),只需要指定委托指向的原型類型即可。比如我們用下面的代碼聲明一個(gè)指向字符類型的函數(shù)原型的委托:

delegatestringTestDelegate();

如果我們聲明了一個(gè)代表,那么它就是對(duì)系統(tǒng)定義的類System.delegate的一個(gè)擴(kuò)展。在委托的實(shí)例中,可以封裝一個(gè)靜態(tài)方法,也可以封裝非靜態(tài)方法。關(guān)于委托的使用,我們來看看下面這個(gè)例子?!纠?-4】

委托的使用。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_4{delegatestringMyDelegate(); //聲明一個(gè)委托

publicclassMydg{//非靜態(tài)方法聲明

publicstringMydg_Normal(){return"非靜態(tài)委托使用";}//static靜態(tài)方法聲明

publicstaticstringMydg_Static(){return"靜態(tài)委托調(diào)用";}}publicclassUserPerson{//定義程序入口

publicstaticvoidMain(){Mydgdg=newMydg();//非靜態(tài)方法調(diào)用MyDelegated=newMyDelegate(dg.Mydg_Normal);Console.WriteLine(d());//靜態(tài)方法調(diào)用,只能用類名Mydg.Mydg_Static,不能寫dg.Mydg_Staticd=newMyDelegate(Mydg.Mydg_Static);Console.WriteLine(d());}}}

程序運(yùn)行結(jié)果如圖2-8所示。圖2-8例2-4運(yùn)行結(jié)果3.?dāng)?shù)組數(shù)組是一種包含若干變量的數(shù)據(jù)結(jié)構(gòu),這些變量都可以通過索引進(jìn)行訪問。數(shù)組中包含的變量(又稱數(shù)組的元素)具有相同的類型,該類型稱為數(shù)組的元素類型。數(shù)組有一個(gè)“秩”,它表示和每個(gè)數(shù)組元素關(guān)聯(lián)的索引的個(gè)數(shù)。數(shù)組的秩又稱為數(shù)組的維度?!爸取睘?的數(shù)組稱為一維數(shù)組,“秩”大于1的數(shù)組稱為多維數(shù)組。通常按維度大小確定的多維數(shù)組稱為二維數(shù)組、三維數(shù)組等。

4.接口從技術(shù)上講,接口是一組包含了函數(shù)型方法的數(shù)據(jù)結(jié)構(gòu),通過這組數(shù)據(jù)結(jié)構(gòu),客戶代碼可以調(diào)用組件對(duì)象的功能。2.2.3值類型和引用類型的區(qū)別值類型與引用類型的根本區(qū)別在于:值類型的變量包含自身的數(shù)據(jù),而引用類型的變量包含的是指向包含數(shù)據(jù)的內(nèi)存塊的引用。對(duì)于值類型,每個(gè)變量都有一份自己的數(shù)據(jù)復(fù)制,因而,不能通過操作其中一個(gè)來影響另一個(gè),而對(duì)于引用類型,兩個(gè)變量有可能引用同一對(duì)象,因而,可以通過操作一個(gè)變量來影響另一個(gè)變量引用的對(duì)象。

【例2-5】

理解值類型與引用類型的區(qū)別。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_5{classValueclass{publicintvalue=0;}classValueandRefType{publicstaticvoidMain(){inta=0;intb=a;b=10;Valueclassref1=newValueclass();Valueclassref2=ref1;ref2.value=10;Console.WriteLine("Value:{0},{1}",a,b);Console.WriteLine("Refs:{0},{1}",ref1.value,ref2.value);}}}

程序運(yùn)行結(jié)果如圖2-9所示。圖2-9例2-5運(yùn)行結(jié)果

說明:

在Console.WriteLine格式中,其參數(shù)的個(gè)數(shù)是可變的,第1個(gè)參數(shù)是一個(gè)串,包含順序符{0}、{1},{0}對(duì)應(yīng)于第1個(gè)參數(shù),{1}對(duì)應(yīng)于第2個(gè)參數(shù),在發(fā)送到Console輸出之前,每個(gè)順序符都要用對(duì)應(yīng)參數(shù)的格式替換。

對(duì)局部變量a和b的初始化,局部變量b可重新賦值,其變量b的改變并不影響變量a的值,而每個(gè)值類型(int)的局部變量都有自己的存儲(chǔ)域。而引用類型則不同,通過賦值ref2.value=10,則影響了ref1和ref2所引用的對(duì)象。2.3裝?箱?和?拆?箱裝箱是把值類型轉(zhuǎn)換為引用類型(object類型),反之,拆箱則是將引用類型返回到值類型。利用裝箱和拆箱功能,可通過允許值類型的任何值與Object類型的值相互轉(zhuǎn)換,將值類型與引用類型鏈接起來。2.3.1裝箱操作一個(gè)對(duì)象是指所需的一個(gè)對(duì)象。例如,System.Int32值類型,就在堆棧中為這個(gè)變量分配內(nèi)存??梢园堰@個(gè)變量傳遞給任一方法的一個(gè)System.Object類型,并訪問其可訪問的任一成員。這看起來好像是一個(gè)對(duì)象,實(shí)際上,在堆棧中它僅是四字節(jié)的空間。

當(dāng)試圖以某種方式使用該變量時(shí),該系統(tǒng)才自動(dòng)地用System.Object類型接口將變量裝箱,以便它變成一個(gè)引用類型,且可像任何對(duì)象一樣使用。裝箱使得任何事情看起來好像是一個(gè)對(duì)象,即裝箱是一種讓值類型看起來像引用類型的處理過程。因此,一切事情實(shí)際上是一個(gè)對(duì)象。簡(jiǎn)而言之,裝箱是值類型轉(zhuǎn)換成Object類型,是一個(gè)數(shù)值分配一個(gè)對(duì)象實(shí)例,并把這個(gè)數(shù)值復(fù)制到新對(duì)象中。例如:

intnum=1025; //值類型

objectobj=num; //num被裝箱到obj

其中,第一行代碼是創(chuàng)建一個(gè)int類型的變量num。int類型是一個(gè)值類型(因?yàn)樗且粋€(gè)基本類型)。在第二行,編譯器看到該變量num,就把它復(fù)制到一個(gè)由變量obj表示的引用類型。然后,編譯器將所需裝箱的num值轉(zhuǎn)換為MSIL代碼。

總之,執(zhí)行上述語(yǔ)句后,就在堆棧創(chuàng)建一個(gè)對(duì)象obj,該對(duì)象引用了堆棧上int類型的數(shù)值(此值是賦給變量num的數(shù)值的復(fù)制)。

【例2-6】

裝箱的使用。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_6{publicclassbox{publicstaticvoidMain(){intnum=1025;objectobj=num;num=1119;Console.WriteLine("Resultofnumis:{0}",num);Console.WriteLine("Resultofobjis:{0}",obj);Console.WriteLine();}}}

程序運(yùn)行結(jié)果如圖2-10所示。圖2-10例2-6運(yùn)行結(jié)果2.3.2拆箱操作拆箱是將object類型轉(zhuǎn)換為值類型,首先檢查對(duì)象實(shí)例,確認(rèn)它是給定值類型的包裝實(shí)例,然后把實(shí)例中的值復(fù)制到值類型的實(shí)例中?,F(xiàn)在,把obj轉(zhuǎn)換回到值類型,可以進(jìn)行一個(gè)顯式的轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換):

intnum=1025 //值類型

objectobj=num; //num被裝箱到obj intnum2=(int)obj; //拆箱返回到int

注意:當(dāng)裝箱時(shí)(當(dāng)再一次從一個(gè)值類型轉(zhuǎn)換為一個(gè)引用類型時(shí)),不需要顯式地強(qiáng)制類型轉(zhuǎn)換。然而,當(dāng)拆箱時(shí)(從引用類型轉(zhuǎn)換到值類型)則必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換。這是由于在拆箱的情況下,一個(gè)對(duì)象可以強(qiáng)制轉(zhuǎn)換到任何類型。因此,強(qiáng)制轉(zhuǎn)換是必須的,以便編譯器能夠檢驗(yàn)出該轉(zhuǎn)型每次指定的變量類型是合法的?!纠?-7】

拆箱的使用。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_7{publicclassBoxAndUnbox{publicstaticvoidMain(){intnum=1025;objectobj=num;intnum2=(int)obj;Console.WriteLine("Resultofnum2is:{0}",num2);Console.WriteLine();}}}

程序運(yùn)行結(jié)果如圖2-11所示。圖2-11例2-7運(yùn)行結(jié)果2.3.3實(shí)例1:身體質(zhì)量指數(shù)計(jì)算問題:用一個(gè)稱為“身體質(zhì)量指數(shù)(BMI)”的量來計(jì)算與體重有關(guān)的健康問題的危險(xiǎn)程度。BMI按下面的公式計(jì)算:其中,w是以千克為單位的體重,h是以米為單位的身高。BMI的值為20~25被認(rèn)為是“正常的”,編寫一個(gè)應(yīng)用程序,輸入體重和身高并輸出BMI。分析:此問題可以定義w和h兩個(gè)變量用來接收用戶輸入的體重和身高值,變量BMI用來存儲(chǔ)計(jì)算的結(jié)果值,根據(jù)公式計(jì)算出結(jié)果并顯示相應(yīng)信息。BMI=

實(shí)現(xiàn)步驟:

(1)創(chuàng)建一個(gè)名為“l(fā)esson2Example1”的控制臺(tái)應(yīng)用程序。

(2)將class1.cs更名為BMI.cs。

(3)將以下代碼添加到“BMI.cs”中。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceLesson_2_Example1{classBMI{staticvoidMain(string[]args){ floatw,h,BMI; //定義三個(gè)浮點(diǎn)型變量

Console.WriteLine("請(qǐng)輸入體重的值(以千克為單位)"); w=float.Parse(Console.ReadLine());//將輸入體重值進(jìn)行類型轉(zhuǎn)換并把值賦給w Console.WriteLine("請(qǐng)輸入身高的值(以米為單位)"); h=float.Parse(Console.ReadLine()); //將輸入的身高值賦給h BMI=w/(h*h); //計(jì)算BMI的值

Console.WriteLine("根據(jù)你輸入的值計(jì)算出身體質(zhì)量指數(shù)(BMI)為:{0}",BMI); }}}

程序運(yùn)行結(jié)果如圖2-12所示。圖2-12實(shí)例1運(yùn)行結(jié)果2.4C#?中的運(yùn)算符與表達(dá)式

C#中表達(dá)式類似于數(shù)學(xué)運(yùn)算中的表達(dá)式,是由運(yùn)算符、操作對(duì)象和標(biāo)點(diǎn)符號(hào)等連接而成的式子。在學(xué)習(xí)運(yùn)算符時(shí)要注意運(yùn)算符的兩個(gè)重要特性:優(yōu)先級(jí)和結(jié)合性。優(yōu)先級(jí)規(guī)定了優(yōu)先級(jí)高的運(yùn)算先執(zhí)行,優(yōu)先級(jí)低的運(yùn)算后執(zhí)行,在相同優(yōu)先級(jí)的情況下,結(jié)合性決定運(yùn)算的順序,左結(jié)合的從左往右算,右結(jié)合的從右往左算。2.4.1運(yùn)算符的分類根據(jù)運(yùn)算符作用的操作數(shù)個(gè)數(shù)來劃分運(yùn)算符的類型,C#中有三種類型的運(yùn)算符:

(1)一元運(yùn)算符。一元運(yùn)算符作用于一個(gè)操作數(shù),包括前綴運(yùn)算符和后綴運(yùn)算符。(2)二元運(yùn)算符。二元運(yùn)算符作用于兩個(gè)操作數(shù),使用時(shí)在操作數(shù)中間插入運(yùn)算符。

(3)三元運(yùn)算符。C#中僅有一個(gè)三元運(yùn)算符“?:”,三元運(yùn)算符作用于三個(gè)操作數(shù),使用時(shí)在操作數(shù)中間插入運(yùn)算符。下面是使用運(yùn)算符的例子:

intx=5,y=10,z;x++; //后綴一元運(yùn)算符

--x; //前綴一元運(yùn)算符

z=x+y; //二元運(yùn)算符

y=(X>10?0:1); //三元運(yùn)算符下面通過表2-5了解各運(yùn)算符的作用和用法。表2-5各運(yùn)算符的作用與用法

注意:應(yīng)用除法運(yùn)算符“/”要注意,當(dāng)參與運(yùn)算的兩個(gè)操作數(shù)都是整數(shù),則運(yùn)算結(jié)果也是整數(shù),是這兩個(gè)數(shù)作除法運(yùn)算所得的商;當(dāng)參加運(yùn)算的兩個(gè)操作數(shù)有一個(gè)是浮點(diǎn)數(shù),則運(yùn)算的結(jié)果也是浮點(diǎn)數(shù),是這兩個(gè)數(shù)作除法運(yùn)算所得的結(jié)果。2.4.2關(guān)系運(yùn)算符關(guān)系運(yùn)算符:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、=?=(等于)、!=(不等)、is運(yùn)算符、as運(yùn)算符,如表2-6所示。表2-6關(guān)系運(yùn)算符的返回結(jié)果is運(yùn)算符可以檢查對(duì)象是否與特定的類型兼容:

inti=10; if(iisobject) { Console.WriteLine("iisanobject"); }int和從object繼承而來的其他C#數(shù)據(jù)類型一樣,表達(dá)式iisobject將得到true,并顯示信息。

as運(yùn)算符用于執(zhí)行引用類型的顯式類型轉(zhuǎn)換。如果要轉(zhuǎn)換的類型與指定的類型兼容,轉(zhuǎn)換就會(huì)成功進(jìn)行;如果類型不兼容,as運(yùn)算符就會(huì)返回值null。如下面的代碼所示,如果object引用不指向string實(shí)例,把object引用轉(zhuǎn)換為string就會(huì)返回null。objecto1="SomeString"; objecto2=5; strings1=o1asstring;

//s1="SomeString" strings2=o2asstring;

//s1=nullas運(yùn)算符允許在一步中進(jìn)行安全的類型轉(zhuǎn)換,不需要先使用is運(yùn)算符測(cè)試類型,再執(zhí)行轉(zhuǎn)換。

【例2-8】

關(guān)系運(yùn)算符“&&”與“||”的使用。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_8{classProgram{staticvoidMain(string[]args){intx=8;inty=12;Console.Write("請(qǐng)輸入一個(gè)數(shù):");//聲明一個(gè)string類型的變量k用于用戶輸入

stringk;//讀取用戶輸入

k=Console.ReadLine();//強(qiáng)制將string類型的變量k的值賦給int類型的變量z

intz=Convert.ToInt32(k);

//如果z>x并且z>=y則輸出結(jié)果,這里用到與運(yùn)算

if(z>x&&z>y)Console.WriteLine("經(jīng)判斷,這是最大數(shù)");//如果z<x或者z<=y則輸出結(jié)果,這里用到或運(yùn)算

if(z<x||z<y)Console.WriteLine("經(jīng)判斷,這不是最大數(shù)");}}}

程序運(yùn)行結(jié)果如圖2-13所示。圖2-13例2-8運(yùn)行結(jié)果【例2-9】?:運(yùn)算符的應(yīng)用。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_9{classProgram{staticvoidMain(string[]args)

{intx=8;inty=12;intz;

//使用條件運(yùn)算符,如果x等于y,則輸出1,否則輸出0z=(x==y)?1:0;Console.WriteLine("結(jié)果為:{0}",z);}}}

程序運(yùn)行結(jié)果如圖2-14所示。圖2-14例2-9運(yùn)行結(jié)果2.4.3運(yùn)算符的優(yōu)先級(jí)在計(jì)算表達(dá)式時(shí),每個(gè)運(yùn)算符都會(huì)按順序處理,但這并不意味著從左至右地運(yùn)用這些運(yùn)算符。例如,有下面的代碼:

var1=var2+var3;

其中“+”運(yùn)算符就是在“=”運(yùn)算符之前進(jìn)行計(jì)算的。在其他一些情況下,運(yùn)算符的優(yōu)先級(jí)并沒有這么明顯,例如:

var1=var2+var3*var4;

其中“*”運(yùn)算符先計(jì)算,其后是“+”運(yùn)算符,最后是“=”運(yùn)算符,這是標(biāo)準(zhǔn)的數(shù)學(xué)順序,其結(jié)果與我們?cè)诩埳线M(jìn)行算術(shù)運(yùn)算的結(jié)果相同。

像這樣的計(jì)算,可以使用括號(hào)控制運(yùn)算符的優(yōu)先級(jí),例如:

var1=(var2+var3)*var4;

括號(hào)中的內(nèi)容先計(jì)算,即“+”運(yùn)算符在“*”運(yùn)算符之前計(jì)算。對(duì)于前面介紹的運(yùn)算符,其優(yōu)先級(jí)如表2-7所示,優(yōu)先級(jí)相同的運(yùn)算符(如*和/)按照從左至右的順序計(jì)算。表2-7C#運(yùn)算符的優(yōu)先級(jí)(從高到低)

說明:●?%:整除取余?!?&和?|?以及~和^:&和?|?執(zhí)行按位與和按位或操作,而~和^執(zhí)行按位非和按異或操作。對(duì)于^運(yùn)算,只要它和兩個(gè)操作數(shù)不同就返回True,否則返回False?!?&&和||:執(zhí)行布爾和布爾或操作,而!是布爾非運(yùn)算符。對(duì)于&&運(yùn)算,只有兩個(gè)表達(dá)式同為True,表達(dá)式返回True,如果兩個(gè)表達(dá)式有一個(gè)為False,則結(jié)果為False;如果左邊表達(dá)式為False,表達(dá)式返回False,則右邊表達(dá)式將不進(jìn)行計(jì)算。對(duì)于||運(yùn)算,如果兩個(gè)操作數(shù)有一個(gè)或兩個(gè)為True,則結(jié)果為True,如果兩個(gè)操作數(shù)均為False,則表達(dá)式為False;如果左邊表達(dá)式為True,表達(dá)式為True,則右邊表達(dá)式將不進(jìn)行計(jì)算?!?<<和>>:執(zhí)行整數(shù)類型的左位移和右位移?!?++和--:用于數(shù)值類型的增1和減1。該運(yùn)算符可以放在變量之前,也可放在變量之后,如果放在變量之前(前置形式),則在表達(dá)式中使用它之前,改變變量的值;如果放在變量之后(后置形式),則在表達(dá)式使用該變量,然后改變它的值。●?+=?以及其他組合賦值運(yùn)算符是縮寫的,因而,a+=n意指a=a+n,a/=n意指a=a/n,其余類推?!??:,?是三元條件運(yùn)算,用于在兩個(gè)可能的選擇之間選擇一個(gè),取決于一個(gè)表達(dá)式的值是True還是False。例如,(x>5)?9:10,即如果x大于5,則結(jié)果為9,否則為10。注意:=用于賦值,而==用于測(cè)試相等。千萬(wàn)不要混淆?!?new:用于在堆棧上創(chuàng)建對(duì)象,并調(diào)用構(gòu)造函數(shù)。●?sizeof:用于找出一個(gè)對(duì)象或類型的長(zhǎng)度(以字節(jié)為單位),因此,sizeof(decimal)返回值16,因?yàn)閐ecimal是16字節(jié)長(zhǎng)?!?is和typeof:用于在運(yùn)行時(shí)被調(diào)用而獲取某個(gè)類型的System.Type對(duì)象,形式為:typeof(類型)。其中,類型為要獲取的System.Type的類型?!?checked和unchecked:用于控制編譯器處理算術(shù)計(jì)算的溢出條件?!?as:用于在兼容類型之間進(jìn)行轉(zhuǎn)換。和強(qiáng)制轉(zhuǎn)換有些相似,當(dāng)轉(zhuǎn)換失敗時(shí)返回null。轉(zhuǎn)換形式為:表達(dá)式as類型。【例2-10】求二次方程的解。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_10{classProgram{staticvoidMain(string[]args){//x2的系數(shù)

intcoefficient1=2;//x的系數(shù)

intcoefficient2=-7;//二次方程的常數(shù)值

intconstant=3;//存放表達(dá)式b2-4ac的值

doubleexpression=0;doublex1=0;doublex2=0;Console.WriteLine("二次方程為:{0}x2+{1}x+{2}",coefficient1,coefficient2,constant);expression=Math.Sqrt(coefficient2*coefficient2-(4*coefficient1*constant));x1=((-coefficient2)+expression)/(2*coefficient1);x2=((-coefficient2)-expression)/(2*coefficient1);Console.Write("x={0:F2}",x1);Console.Write("或");Console.WriteLine("x={0:F2}",x2);

}}}

程序運(yùn)行結(jié)果如圖2-15所示。圖2-15例2-10運(yùn)行結(jié)果2.5C#?中的選擇語(yǔ)句當(dāng)程序中需要進(jìn)行兩個(gè)或兩個(gè)以上的選擇時(shí),可以根據(jù)條件來選擇將要執(zhí)行的一組語(yǔ)句。在C#中,實(shí)現(xiàn)該功能的語(yǔ)句有if語(yǔ)句和switch語(yǔ)句。2.5.1if語(yǔ)句

if語(yǔ)句是最常用的選擇語(yǔ)句,它根據(jù)布爾表達(dá)式的值來判斷是否執(zhí)行后面的內(nèi)嵌語(yǔ)句。一般來說,if語(yǔ)句有三種格式,這三種格式分別用于不同的情況。格式一:

if(表達(dá)式)語(yǔ)句1;

這種格式只需要判定某種條件是否成立,成立時(shí)才執(zhí)行語(yǔ)句1,不成立時(shí)不作處理。例如:inta=3;intb=5;boolc=false;if(a=?=b)c=true;

格式二:

if(表達(dá)式){

語(yǔ)句1}else{

語(yǔ)句2}

這種格式先判斷條件是否成立。成立時(shí)執(zhí)行語(yǔ)句1代碼,不成立時(shí)執(zhí)行語(yǔ)句2代碼,這種格式適合兩種可能的情況,用于對(duì)兩種情況均需要處理的時(shí)候。例如:

inta=3;intb=5;boolc;if(a==b){c=true;}else{ c=false;}格式三:

if(表達(dá)式一){

語(yǔ)句1}elseif(表達(dá)式二){

語(yǔ)句2}else{

語(yǔ)句3}

這種情況適用于存在兩種以上可能情況的時(shí)候,先判斷表達(dá)式一是否成立,成立時(shí)執(zhí)行語(yǔ)句1,否則判斷表達(dá)式二,表達(dá)式二成立時(shí)執(zhí)行語(yǔ)句2,表達(dá)式二不成立則執(zhí)行語(yǔ)句3。若使用多重if語(yǔ)句嵌套,依此類推??梢允褂脳l件運(yùn)算符(?:)簡(jiǎn)化if條件語(yǔ)句,條件運(yùn)算符取三個(gè)表達(dá)式為操作數(shù)組成條件運(yùn)算表達(dá)式,它只能執(zhí)行一個(gè)語(yǔ)句或者一個(gè)塊,并取其結(jié)果作為表達(dá)式的值。其一般形式為:

表達(dá)式1?表達(dá)式2:表達(dá)式3

表達(dá)式1是一個(gè)返回True或False的布爾表達(dá)式,表達(dá)式計(jì)算為True時(shí),條件運(yùn)算符返回表達(dá)式2的值,若為False,則返回表達(dá)式3的值。

例如,條件語(yǔ)句:

if(a>=b) s=a*a; else s=b*b;

可簡(jiǎn)化為條件賦值語(yǔ)句:

s=(a>=b)?a*a:b*b;

表示若a>=b,則s等于a*a,否則為b*b。

【例2-11】

輸入兩個(gè)數(shù),輸出較大的數(shù),兩數(shù)相等時(shí)輸出相應(yīng)的提示信息。

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceDemo2_11{classProgram{staticvoidMain(string[]args){doublea,b,max;strings;Console.Write("Entervalueofa:");s=Console.ReadLine();a=double.Parse(s);Console.Write("Entervalueofb:");s=Console.ReadLine();b=double.Parse(s);if(a>b){max=a;Console.WriteLine("Themaxnumberis:{0}",max);}else{if(a==b){Console.WriteLine("aandbisequal,thevalueis{0}",a);}else{Console.WriteLine("Themaxnumberis:{0}",b);}}}}}

分別輸入兩個(gè)數(shù),假設(shè)輸入a的值為23,b的值為56,則程序運(yùn)行結(jié)果如圖2-16所示。圖2-16例2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論