第3章C程序設(shè)計基礎(chǔ)_第1頁
第3章C程序設(shè)計基礎(chǔ)_第2頁
第3章C程序設(shè)計基礎(chǔ)_第3頁
第3章C程序設(shè)計基礎(chǔ)_第4頁
第3章C程序設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章C#程序設(shè)計基礎(chǔ)

3.1標(biāo)識符3.2C#中數(shù)據(jù)類型3.3C#中的變量和常量3.4類型轉(zhuǎn)換

3.5結(jié)構(gòu)類型和枚舉類型3.6C#運算符和表達(dá)式3.7C#中常用類和結(jié)構(gòu)3.1標(biāo)識符C#的標(biāo)識符名稱必須遵守以下規(guī)則:(1)所有的標(biāo)識符只能由字母、數(shù)字和下劃線這3類字符組成,且第一個字符必須為字母或下劃線。(2)標(biāo)識符中不能包含空格、標(biāo)點符號、運算符等其他符號。(3)標(biāo)識符嚴(yán)格區(qū)分大小寫。(4)標(biāo)識符不能與C#關(guān)鍵字名相同。(5)標(biāo)識符不能與C#中的類庫名相同。a12_c√1abc3.2C#中數(shù)據(jù)類型C#中數(shù)據(jù)類型分類3.2.1值類型值類型的變量內(nèi)含變量值本身,C#的值類型可以分為簡單類型、結(jié)構(gòu)類型和枚舉類型。下面僅介紹簡單類型。1.整數(shù)類型2.實數(shù)類型3字符類型例如,可以采用如下方式字符變量賦值:

charc='H'; //字符Hcharc='\x0048'; //字符H,十六進(jìn)制轉(zhuǎn)義符(前綴為\x)charc='\u0048'; //字符H,Unicode表示形式(前綴為\u)charc=‘\r’; //回車,轉(zhuǎn)義字符在表示一個字符常數(shù)時,單引號內(nèi)的有效字符數(shù)量必須且只能是一個,而且不能是單引號或者反斜杠(\)。4.布爾類型布爾類型數(shù)據(jù)用于表示邏輯真和邏輯假,布爾類型的類型標(biāo)識符是bool。注意:在C#語言中,bool類型不能像C++語言那樣可能直接轉(zhuǎn)換為int類型,例如,inta=(2<3);在C/C++中都是正確的,但在C#中不允許這樣,會出現(xiàn)“無法將類型bool隱式轉(zhuǎn)換為int”的編譯錯誤。3.2.2引用類型引用類型也稱為參考類型。和值類型相比,引用類型的變量不直接存儲所包含的值,而是指向它所要存儲的值。類似C中的指針。1.object類object是C#中所有類型(包括所有的值類型和引用類型)的基類,C#中的所有類型都直接或間接地從object類中繼承而來。因此,對一個object的變量可以賦予任何類型的值。

floatf=1.23;objectobj1; //定義obj1對象obj1=f;objectobj2="China"; //定義obj2對象并賦初值2.string類C#還定義了一個string類,表示一個Unicode字符序列,專門用于對字符串的操作。同樣,這個類也是在.NETFramework的命名空間System中定義的,是類System.String的別名。字符串在實際中應(yīng)用非常廣泛,利用string類中封裝的各種內(nèi)部操作,可以很容易完成對字符串處理。例如:

stringstr1="123"+"abc";//"+"運算符用于連接字符串charc="HelloWorld!"[2];//"[]"運算符可以訪問string中的單個字符,c='e'stringstr2="China";stringstr3=@"China";//字符串的另一種表示形式,用@引起來。boolb=(str2==str3); //"=="運算符用于兩個字符串比較,b=true3.3C#中的變量和常量3.3.1變量1.變量定義在C#程序里使用某個變量之前,必須要告訴編譯器它是一個什么樣的變量,因此要對變量進(jìn)行定義。定義變量的方法如下:

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

stringname="王華";intage=20;也可以同時聲明一個或多個給定類型的變量,例如:

inta=1,b=2,c=3;定義一個變量,系統(tǒng)就會在內(nèi)存中開辟相應(yīng)大小的空間來存放數(shù)據(jù)??梢詮南旅?個層面來理解變量。變量名稱變量的值變量的數(shù)據(jù)類型變量的作用域3.3.2值類型變量和引用類型變量的區(qū)別程序的內(nèi)存空間分為??臻g和堆空間,值類型的數(shù)據(jù)在??臻g中分配,而引用類型數(shù)據(jù)(對象)在堆空間中分配。程序的執(zhí)行空間:??臻g堆空間1.理解值類型的變量C#中的值類型變量和C/C++語言中的普通變量(非指針變量)相似,這類變量直接包含它們的值。C#中在內(nèi)存的??臻g中為值類型變量分配空間,而且沒有單獨的堆分配或垃圾回收開銷。因此值類型變量會隨著方法調(diào)用后??臻g的消亡而自動清除(C#中的值類型變量像C/C++語言中函數(shù)內(nèi)的局部變量,函數(shù)執(zhí)行完后由系統(tǒng)釋放其存儲空間)。例如:intx;inty=2;x=y;2.理解引用類型的變量在C/C++語言中可以定義指針變量,例如:

char*p;其中,p是一個指針變量,其中存放某個字符變量的地址,注意變量p和它所指向的字符變量是兩個不同的東西。在C#中沒有指針,而改為引用,引用表示某個對象的地址而不是變量或?qū)ο蟊旧?。C#中引用類型變量和其所指的對象的關(guān)系,如同前面C/C++語言中的變量p和它所指向的字符變量的關(guān)系。在C#中,無論值類型變量還是引用類型變量,都是在??臻g中分配對應(yīng)的存儲空間,所不同的是,引用類型變量所指向的對象是在托管堆上分配內(nèi)存空間的,為什么這樣呢?先看一個簡單的C/C++語言函數(shù):voidfun(){ char*p; //定義指針變量p inti; //定義整型變量i p=(char*)malloc(10*sizeof(char));//為p分配10個字符的空間 for(i=0;i<10;i++) //為10個字符單元分別賦值'a'~'j'

*(p+i)='a'+i; printf("%s\n",p); //輸出:abcdefghij

}該函數(shù)被調(diào)用后,其中局部變量p和i的空間被回收,但p所指向的10字符空間并沒有被回收,即便程序執(zhí)行結(jié)束,該空間仍然沒有回收。這樣可能出現(xiàn)內(nèi)存泄漏問題。解決的方法是在上述函數(shù)的末尾加上free(p)語句回收p所指向的內(nèi)存空間。.NETFramework改進(jìn)了這一點:將C#應(yīng)用程序的執(zhí)行置于CLR的監(jiān)控之下,而且所有引用類型變量所指向的對象(其生命周期是全局性的)都在托管堆上分配空間,程序執(zhí)行完畢,由CLR將堆空間全部回收,這樣就不會出現(xiàn)像前面C/C++程序出現(xiàn)的內(nèi)存泄漏問題了。所以在C#中,當(dāng)定義一個引用類型變量時,系統(tǒng)在??臻g中為該引用變量分配存儲空間,要想創(chuàng)建對象并把對象的存儲地址賦給該變量,就需要使用new操作符。例如:MyClassvar; //MyClass是已定義的類或類型var=newMyClass(); //創(chuàng)建var引用的實例第2個語句使用new操作符來創(chuàng)建對象,C#會在堆存儲空間中為這個對象分配足夠的空間來存放MyClass類的一個實例,然后把這個實例的地址賦給這個引用類型變量var,如圖3.5所示。以后就可以通過這個引用類型變量var來操作堆中創(chuàng)建的那個對象了。圖3.5引用類型變量及其所指對象3.3.3常量1.直接常量直接常量是指把程序中不變的量直接硬編碼為數(shù)值或字符串值,例如,以下都是直接常量:

100 //整型直接常量1.23e5 //浮點型直接常量2.符號常量符號常量是通過關(guān)鍵字const聲明的常量,包括常量的名稱和它的值。常量聲明的格式如下:

const數(shù)據(jù)類型常量名=初始值;其中,“常量名”必須是C#的合法標(biāo)識符,在程序中通過常量名來訪問該常量?!邦愋蜆?biāo)識符”指示了所定義的常量的數(shù)據(jù)類型,而“初始值”是所定義的常量的值。例如:

constdoublePI=3.14159265;3.4類型轉(zhuǎn)換值類型之間的轉(zhuǎn)換有隱式轉(zhuǎn)換和顯式轉(zhuǎn)換。另外裝箱和拆箱也屬于一種類型轉(zhuǎn)換。3.4.1隱式轉(zhuǎn)換隱式轉(zhuǎn)換是系統(tǒng)默認(rèn)的、不需要加以聲明就可以進(jìn)行的轉(zhuǎn)換。3.4.2顯式轉(zhuǎn)換顯式轉(zhuǎn)換又叫強(qiáng)制類型轉(zhuǎn)換,與隱式轉(zhuǎn)換相反,顯式轉(zhuǎn)換需要用戶明確地指定轉(zhuǎn)換類型,一般在不存在該類型的隱式轉(zhuǎn)換時才使用。格式如下:

(類型標(biāo)識符)表達(dá)式其作用是將“表達(dá)式”值的類型轉(zhuǎn)換為“類型標(biāo)識符”的類型。例如:

(int)1.23//把double類型的1.23轉(zhuǎn)換成int類型,結(jié)果為1

需要提醒注意以下幾點:(1)顯式轉(zhuǎn)換可能會導(dǎo)致錯誤。進(jìn)行這種轉(zhuǎn)換時編譯器將對轉(zhuǎn)換進(jìn)行溢出檢測。如果有溢出說明轉(zhuǎn)換失敗,就表明源類型不是一個合法的目標(biāo)類型,轉(zhuǎn)換就無法進(jìn)行。(2)對于從float、double、decimal到整型數(shù)據(jù)的轉(zhuǎn)換,將通過舍入得到最接近的整型值,如果這個整型值超出目標(biāo)類型的范圍,則出現(xiàn)轉(zhuǎn)換異常。【例3.1】設(shè)計一個控制臺程序說明類型轉(zhuǎn)換的應(yīng)用。usingSystem;namespaceProj3_1{classProgram{staticvoidMain(string[]args){inti=65,i1,i2; doubled=66.3456,d1,d2; charc='A',c1,c2; Console.WriteLine("i={0:d5},d={1:f},c={2}",i,d,c); i1=(int)d; //強(qiáng)制類型轉(zhuǎn)換 d1=i;//隱式類型轉(zhuǎn)換 c1=(char)i; //強(qiáng)制類型轉(zhuǎn)換 Console.WriteLine("i1={0:d5},d1={1:f},c1={2}",i1,d1,c1); i2=c; //隱式類型轉(zhuǎn)換 d2=(int)d; //強(qiáng)制類型轉(zhuǎn)換,轉(zhuǎn)換成整數(shù)后再隱式轉(zhuǎn)為double類型 c2=(char)d; //強(qiáng)制類型轉(zhuǎn)換 Console.WriteLine("i2={0:d5},d2={1:f},c2={2}",i2,d2,c2);}}}3.4.3裝箱和拆箱1.裝箱轉(zhuǎn)換裝箱轉(zhuǎn)換是指將一個值類型的數(shù)據(jù)隱式地轉(zhuǎn)換成一個對象類型的數(shù)據(jù)。例如,下面語句就執(zhí)行了裝箱轉(zhuǎn)換:

inti=10;objectobj=i;

裝箱轉(zhuǎn)換過程2.拆箱轉(zhuǎn)換拆箱轉(zhuǎn)換是指將一個引用類型的數(shù)據(jù)顯式地轉(zhuǎn)換成一個值類型數(shù)據(jù)。拆箱操作分為兩步:首先檢查對象實例,確保它是給定值類型的一個裝箱值,然后把實例的值復(fù)制到值類型數(shù)據(jù)中。例如,下面兩條語句就執(zhí)行了拆箱轉(zhuǎn)換:objectobj=10;

inti=(int)obj; //拆箱折箱轉(zhuǎn)換過程3.5結(jié)構(gòu)類型和枚舉類型3.5.1結(jié)構(gòu)類型1.結(jié)構(gòu)類型的聲明結(jié)構(gòu)類型由若干“成員”組成的。數(shù)據(jù)成員稱為字段,每個字段都有自已的數(shù)據(jù)類型。聲明結(jié)構(gòu)類型的一般格式如下:

struct結(jié)構(gòu)類型名稱{ [字段訪問修飾符]數(shù)據(jù)類型字段1; [字段訪問修飾符]數(shù)據(jù)類型字段2; ... [字段訪問修飾符]數(shù)據(jù)類型字段n;};例如,以下聲明一個具有姓名和年齡的結(jié)構(gòu)體類型Student:structStudent //聲明結(jié)構(gòu)類型Student{publicintxh; //學(xué)號publicstringxm; //姓名publicstringxb; //性別publicintnl; //年齡publicstringbh; //班號};2.結(jié)構(gòu)類型變量的定義聲明一個結(jié)構(gòu)類型后,可以定義該結(jié)構(gòu)類型的變量(簡稱為結(jié)構(gòu)變量)。定義結(jié)構(gòu)變量的一般格式如下:

結(jié)構(gòu)類型結(jié)構(gòu)變量;例如,在前面的結(jié)構(gòu)類型Student聲明后,定義它的兩個變量如下:

Students1,s2;3.結(jié)構(gòu)變量的使用1)訪問結(jié)構(gòu)變量字段訪問結(jié)構(gòu)變量字段的一般格式如下:

結(jié)構(gòu)變量名.字段名例如,s1.xh表示結(jié)構(gòu)變量s1的學(xué)號,s2.xm表示結(jié)構(gòu)變量s2的姓名。結(jié)構(gòu)體變量的字段可以在程序中單獨使用,與普通變量完全相同。2)結(jié)構(gòu)變量的賦值結(jié)構(gòu)變量的賦值有兩種方式。結(jié)構(gòu)變量的字段賦值:使用方法與普通變量相同。結(jié)構(gòu)變量之間賦值:要求賦值的兩個結(jié)構(gòu)變量必須類型相同。例如:

s1=s2;這樣s2的所有字段值賦給s1的對應(yīng)字段?!纠?.2】設(shè)計一個控制臺程序說明結(jié)構(gòu)類型的應(yīng)用。usingSystem;namespaceProj3_2{classProgram{structStudent//結(jié)構(gòu)類型聲明應(yīng)放在Main函數(shù)的外面{ publicintxh; //學(xué)號 publicstringxm;//姓名 publicstringxb; //性別 publicintnl; //年齡 publicstringbh; //班號}staticvoidMain(string[]args){Students1,s2; //定義兩個結(jié)構(gòu)類型變量 s1.xh=101; s1.xm="李明"; s1.xb="男"; s1.nl=20; s1.bh="07001"; Console.WriteLine("學(xué)號:{0},姓名:{1},性別:{2},年齡:{3}, 班號:{4}",s1.xh,s1.xm,s1.xb,s1.nl,s1.bh); s2=s1; //將結(jié)構(gòu)變量s1賦給s2 s2.xh=108; s2.xm="王華"; Console.WriteLine("學(xué)號:{0},姓名:{1},性別:{2},年齡:{3}, 班號:{4}",s2.xh,s2.xm,s2.xb,s2.nl,s2.bh);}}}3.5.2枚舉類型枚舉類型也是一種自定義數(shù)據(jù)類型,它允許用符號代表數(shù)據(jù)。枚舉是指程序中某個變量具有一組確定的值,通過“枚舉”可以將其值一一列出來。1.枚舉類型的聲明枚舉類型使用enum關(guān)鍵字聲明,其一般語法形式如下:

enum枚舉名{枚舉成員1,枚舉成員2,}其中,enum是結(jié)構(gòu)類型的關(guān)鍵字。例如,以下聲明一個名稱為color的表示顏色的枚舉類型:

enumColor{Red,Green,Blue,White,Black}在聲明枚舉類型后,可以通過枚舉名來訪問枚舉成員,其使用語法如下:

枚舉名.枚舉成員2.枚舉成員的賦值在聲明的枚舉類型中,每一個枚舉成員都有一個相對應(yīng)的常量值,默認(rèn)情況下C#規(guī)定第1個枚舉成員的值取0,它后面的每一個枚舉成員的值按加1遞增。例如,前面Color中,Red值為0,Green值為1,Blue值為2,依次類推??梢詾橐粋€或多個枚舉成員賦整型值,當(dāng)某個枚舉成員賦值后,其后的枚舉成員沒有賦值的話,自動在前一個枚舉成員值之上加1作為其值。例如:

enumColor{Red=0,Green,Blue=3,White,Black=1};則這些枚舉成員的值分別為0、1、3、4、1。3.枚舉類型變量的定義聲明一個枚舉類型后,可以定義該枚舉類型的變量(簡稱為枚舉變量)。定義枚舉變量的一般格式如下:

枚舉類型枚舉變量;例如,在前面的枚舉類型Color聲明后,定義它的兩個變量如下:

Colorc1,c2;1)枚舉變量的賦值枚舉變量賦值的語法格式如下:

枚舉變量=枚舉名.枚舉成員例如:

c1=Color.Red;2)枚舉變量的訪問枚舉變量像普通變量一樣直接訪問。3.6C#運算符和表達(dá)式3.6.1算術(shù)運算符3.6.2字符串運算符字符串運算符只有一個,就是加號(+)。它除了作為算術(shù)運算符之外,還可以將字符串連接起來,變成合并的新字符串。例如:

strings="Hello";s=s+",World.";Console.WriteLine(s);//輸出:Hello,World.3.6.3賦值運算符賦值運算符(=)用于改變變量的值,它先求出右側(cè)表達(dá)式的結(jié)果,然后再將結(jié)果賦給左側(cè)的變量。3.6.4關(guān)系運算符3.6.5邏輯運算符3.5.6位運算符3.6.7條件運算符條件運算符是一個三元運算符,每個操作數(shù)同時又是表達(dá)式的值。由條件運算符構(gòu)成的表達(dá)式稱為條件表達(dá)式。條件運算符的使用格式如下:

表達(dá)式1?表達(dá)式2:表達(dá)式3它的計算方式為,先計算“表達(dá)式1”(必須為布爾值)的值,如果其值true,則“表達(dá)式2”的值作為整個表達(dá)式的最終結(jié)果;否則“表達(dá)式3”的值作為整個表達(dá)式的值。例如,以下表達(dá)式返回a和b中的最大值:

max=a>b?a:b計算過程是,當(dāng)a>b,max=a;否則max=b。3.6.8其他運算符1.is運算符is運算符用于檢查表達(dá)式是否是指定的類型,如果是,其結(jié)果為true,否則結(jié)果為false。2.sizeof運算符sizeof運算符求值類型數(shù)據(jù)在內(nèi)存中占用的字節(jié)數(shù)。sizeof運算符的語法格式如下:

sizeof(類型標(biāo)識符)其結(jié)果為一個整數(shù),表示指定類型的數(shù)據(jù)在內(nèi)存分配的字節(jié)數(shù)。該運算符只能作用于值類型或值類型變量。3.typeof運算符該運算符用于獲得指定數(shù)據(jù)類型的說明。例如,若聲明了結(jié)構(gòu)Student,則以下語句輸出聲明Student結(jié)構(gòu)類型的程序名等。Console.WriteLine(typeof(Student));4.new運算符該運算符用于創(chuàng)建一個類的對象。3.6.9運算符的優(yōu)先級運算符的優(yōu)先級是指在表達(dá)式中哪一個運算符應(yīng)該首先計算。C#根據(jù)運算符的優(yōu)先級確定表達(dá)式的求值順序:優(yōu)先級高的運算先做,優(yōu)先級低的操作后做,相同優(yōu)先級的操作從左到右依次做,同時用小括號控制運算順序,任何在小括號內(nèi)的運算最優(yōu)先進(jìn)行。3.7C#中常用類和結(jié)構(gòu)C#中一切都是對象。3.7.1String類string類型是.NETFramework中的String類的別名。string類型定義了相等運算符(==和!=)用于比較兩個string對象,另外,+運算符用于連接字符串,[]運算符可以用來訪問string中的各個字符?!纠?.7】設(shè)計一個控制臺程序求用戶輸入的子串在主串中位置。usingSystem;namespaceProj3_6{classProgram{staticvoidMain(string[]args){ Stringmstr,sstr; Console.Write("輸入主串:"); mstr=Console.ReadLine(); Console.Write("輸入子串:"); sstr=Console.ReadLine(); Console.WriteLine("主串長度={0},子串長度={1}",mstr.Length,sstr.Length); if(String.Compare(mstr,sstr)!=0)//使用靜態(tài)方法Console.WriteLine("位置:{0}",mstr.IndexOf(sstr)); elseConsole.WriteLine("兩個字符串相同");}}}3.7.2Math類Math類位于System命名空間中,它包含了實現(xiàn)C#中常用算術(shù)運算功能的方法,這些方法都是靜態(tài)方法,可通過“Math.方法名(參數(shù))”來使用。3.7.3Convert類Convert類位于System命名空間中,用于將一個值類型轉(zhuǎn)換成另一個值類型。這些方法都是靜態(tài)方法,可通過“Convert.方法名(參數(shù))”來使用。3.7.4DateTime結(jié)構(gòu)DateTime結(jié)構(gòu)類位于System命名空間中,DateTime值類型表示值范圍在公元0001年1月1日午夜12:00:00到公元9999年12月31日晚上11:59:59之間的日期和時間??梢酝ㄟ^以下語法格式定義一個日期時間變量:

DateTime日期時間變量=newDateTime(年,月,日,時,分,秒);例如,以下語句定義了2個日期時間變量:

DateTimed1=newDateT

溫馨提示

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

評論

0/150

提交評論