這篇文章主要介紹了C#基礎(chǔ)知識(shí)的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)公司主營(yíng)灌云網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開(kāi)發(fā),灌云h5微信平臺(tái)小程序開(kāi)發(fā)搭建,灌云網(wǎng)站營(yíng)銷推廣歡迎灌云等地區(qū)企業(yè)咨詢關(guān)鍵字:C#的關(guān)鍵字全部大寫
注釋:跟C++ / Java 風(fēng)格一致,///是文檔注釋,只能寫在類、方法、屬性的前面。不能用來(lái)注釋單個(gè)變量。
C#語(yǔ)言也是嚴(yán)格區(qū)分大小寫的
C#中的常量:
常量,顧名思義,就是“不會(huì)改變的量”。
我們平時(shí)書(shū)寫的數(shù)字(比如12.85)、字符(比如'F')、字符串(比如"謝謝"),它們都屬于“字面常量”。
有一些常量既重要又容易出錯(cuò),比如圓周率π的值為3.1415926......,所以,我們常常會(huì)使用自定義常量。請(qǐng)看下面的代碼:
static void Main(string[] args) { const double PI = 3.1415926; //自定義常量PI Console.Write("半徑為4的圓的周長(zhǎng)為:"); //字符串常量 Console.WriteLine(PI * 4 * 2); //使用自定義常量PI Console.Write("半徑為4的圓的面積為:"); //字符串常量 Console.WriteLine(PI * 4 * 4); //使用自定義常量PI }
需要解釋2個(gè)關(guān)鍵字: const 關(guān)鍵字,表明PI是一個(gè)常量; double 關(guān)鍵字,表明PI的類型為“雙精度浮點(diǎn)型”(一種精度很高的數(shù)字類型)。
你會(huì)發(fā)現(xiàn),這段代碼中使用了2次圓周率(周長(zhǎng)、面積),但是因?yàn)槭褂米远x常量,所以字面常量3.1415926只書(shū)寫了一次。這樣做避免了重復(fù)書(shū)寫導(dǎo)致的錯(cuò)誤。
還有一點(diǎn)要特別注意:常量在聲明時(shí)賦值,之后是不能修改的。
上一節(jié)我們學(xué)習(xí)了常量,但編程中使用最多的是變量,這一節(jié)我們學(xué)習(xí)變量。
變量能夠存儲(chǔ)數(shù)據(jù),并且與常量不同,變量存儲(chǔ)的數(shù)據(jù)可以修改。比如今年18歲,明年可以變成19歲。
使用變量分為3步:聲明、賦值、使用。
聲明變量的語(yǔ)法:數(shù)據(jù)類型 變量名;
給變量賦值的語(yǔ)法:變量名=值;
請(qǐng)閱讀下面的代碼:
static void Main(string[] args ) { int age; //聲明一個(gè)類型為int的變量age age = 18; //給變量age賦值為18 Console.WriteLine("我今年" + age+"歲"); //使用變量age age = 19; //修改age變量的值 Console.WriteLine("我今年" + age+"歲"); //使用變量age }
變量的聲明和賦值可以同時(shí)完成(合在一起,也叫初始化)
我們知道聲明變量需要寫出數(shù)據(jù)類型,我們今天要學(xué)習(xí)的是最常用的幾種類型。
字符類型 char ,存儲(chǔ)用 '' (單引號(hào))括起來(lái)的一個(gè)字符,例如:
char sex='男';//存儲(chǔ)性別
字符串類型 string ,存儲(chǔ)用“”(雙引號(hào))括起來(lái)的一串字符,例如:
string address="北京市宣武區(qū)牛街北口";//存儲(chǔ)地址
整數(shù)類型 int ,存儲(chǔ)整數(shù),例如:
int age=23;//存儲(chǔ)年齡
雙精度浮點(diǎn)型 double ,存儲(chǔ)小數(shù),例如:
double salary=7991.63;//存儲(chǔ)工資
以上四種是最常用的數(shù)據(jù)類型,其他常用類型,我們會(huì)隨著課程深入慢慢介紹。
需要注意的是,某種類型的變量,只能存儲(chǔ)這種類型的數(shù)據(jù),否則,可能會(huì)出錯(cuò)。
上一節(jié)我們學(xué)習(xí)了4種數(shù)據(jù)類型,也提到每種類型的變量只能存這種類型的數(shù)據(jù)??墒牵袝r(shí)候真的需要把不同類型的值放在一起運(yùn)算,比如這種:3.5+8 這時(shí)候怎么辦呢?有下面2種情況:
自動(dòng)類型轉(zhuǎn)換:2種不同類型的數(shù)據(jù)運(yùn)算,低精度類型會(huì)自動(dòng)轉(zhuǎn)換為較高精度的類型。
以3.5+8為例,顯然數(shù)字8的精度較低(int),而3.5的精度較高(double),所以,8會(huì)自動(dòng)轉(zhuǎn)換為double型,即轉(zhuǎn)換為3.5+8.0進(jìn)行運(yùn)算,結(jié)果為11.5。
請(qǐng)看這個(gè)例子:double d=2;
2的精度顯然低于變量d的精度,所以2會(huì)自動(dòng)轉(zhuǎn)換為2.0然后賦值給d。
再看這個(gè)例子:int i=3.0;
變量i的精度低于3.0,但是由于i已經(jīng)聲明為int型的變量,變量的值可以變,但變量的類型可不能變來(lái)變?nèi)サ模赃@條命令會(huì)出錯(cuò)的。
強(qiáng)制類型轉(zhuǎn)換:無(wú)法自動(dòng)轉(zhuǎn)換為我們需要的類型,可以用強(qiáng)制類型轉(zhuǎn)換,比如上例可以這樣完成:
int i=(int)3.0;
數(shù)字前面的(int)表示轉(zhuǎn)換的目標(biāo)類型為int,3.0會(huì)被強(qiáng)制轉(zhuǎn)換為3。
需要注意, double 型強(qiáng)制轉(zhuǎn)換為int型將失去小數(shù)部分,比如(int)2.8,我們得到的將是2。
程序中的變量名、常量名、類名、方法名,都叫做標(biāo)識(shí)符。C#有一套標(biāo)識(shí)符的命名規(guī)則,如果命名時(shí)不遵守規(guī)則,就會(huì)出錯(cuò)。這套規(guī)則簡(jiǎn)單說(shuō)有下面三條:
①標(biāo)識(shí)符只能由英文字母、數(shù)字和下劃線組成,不能包含空格和其他字符。
錯(cuò)誤的標(biāo)識(shí)符聲明:string $user; //錯(cuò)在使用了其他字符
②變量名不能用數(shù)字開(kāi)頭。
錯(cuò)誤的標(biāo)識(shí)符聲明:double 6h;//錯(cuò)在用數(shù)字開(kāi)頭
③不能用關(guān)鍵字當(dāng)變量名。
錯(cuò)誤的標(biāo)識(shí)符聲明:char static ;//錯(cuò)在用關(guān)鍵字static做變量名
計(jì)算機(jī)程序,當(dāng)然少不了“計(jì)算”,要計(jì)算就必須了解運(yùn)算符。今天,我們先學(xué)習(xí)算術(shù)運(yùn)算符中的加、減、乘、除。
加:+ 。加號(hào)有2個(gè)用途:當(dāng)用加號(hào)連接兩個(gè)數(shù)字時(shí),會(huì)計(jì)算出這兩個(gè)數(shù)字的和。比如:
Console.WriteLine(9+2.2);//輸出11.2
另一種情況,當(dāng)加號(hào)兩邊包含字符串的時(shí)候,會(huì)把兩邊的表達(dá)式連接成新的字符串。比如:
Console.WriteLine(9+"2.2");//輸出92.2,因?yàn)?2.2"是字符串,所以9也被轉(zhuǎn)換為"9",+起的作用是連接字符串
減:- 。減號(hào)的作用就是減法。比如:
Console.WriteLine(15-23);//輸出-8
乘:* 。乘號(hào)的作用是求2數(shù)的乘積。比如:
Console.WriteLine(0.8*3);//輸出2.4
除:/ 。除號(hào)的作用是求2數(shù)相除的商。比如:
Console.WriteLine(2/0.5);//輸出4.0
但是,2個(gè)整數(shù)相除,結(jié)果僅保留整數(shù)部分,小數(shù)部分會(huì)被舍去。
Console.WriteLine(5/10);//輸出0
這一節(jié)我們學(xué)習(xí)取余運(yùn)算符。
C#中的取余運(yùn)算符就是%。上一節(jié)學(xué)習(xí)的除號(hào),作用是求2個(gè)數(shù)字相除的商,而取余運(yùn)算符%的作用是求兩個(gè)數(shù)字相除的余數(shù)。比如:
Console.WriteLine(19/5);//求19除以5的商,輸出3Console.WriteLine(19%5);//求19除以5的余數(shù),輸出4(商3余4)
編程中,%常常用來(lái)檢查一個(gè)數(shù)字是否能被另一個(gè)數(shù)字整除。比如下面的代碼片段:
int number = 29; Console.WriteLine(number%2);//求number除以2的余數(shù)
如果輸出0,表示沒(méi)有余數(shù),即number能夠被2整除(是偶數(shù));如果輸出1,表示有余數(shù),即number不能被2整除(是奇數(shù))。
這一節(jié)學(xué)習(xí)兩個(gè)特別的運(yùn)算符++和--。
++,叫做自加運(yùn)算符。比如你今年18歲,明年長(zhǎng)了一歲,用代碼寫出來(lái)是這樣:
int age=18;//今年18歲 age=age+1;//明年,在今年的年齡上加1歲
也可以寫成這樣:
int age=18;//今年18歲 age++;//明年,在今年的年齡上加1歲
age++;
與age=age+1;
作用相同,都是變量的值+1。
--,叫做自減運(yùn)算符。同理,你今年18歲,用了XX護(hù)膚水以后,明年變成17歲了,可以這樣寫:
int age=18;//今年18歲 age--;//等同于 age=age-1;
另外,age++;
與age--;
也可以寫作++age;
或--age;
但請(qǐng)注意:如果與其他運(yùn)算在同一語(yǔ)句中,++寫在變量前面或后面,算法不一樣,請(qǐng)看下例:
Console.WriteLine(age++);作用等同于下面兩句:
Console.WriteLine(age);//先打印a ge=age+1;//后自加
Console.WriteLine(++age);作用等同于下面兩句:
age=age+1;//先自加 Console.WriteLine(age);//后打印
你看,運(yùn)算順序不一樣吧,所以輸出的結(jié)果也不會(huì)相同。
比較數(shù)字大小,或者比較數(shù)字相等的運(yùn)算符是比較運(yùn)算符。C#中的比較運(yùn)算符有:
注意:表示兩個(gè)值相等的“等于”是由2個(gè)“=”組成的。
比較運(yùn)算的結(jié)果,都是布爾類型( bool ),bool類型我們是第一次提到,它表示邏輯上的真(成立)與假(不成立)。真與假用關(guān)鍵字 true 和 false 表示。
上面程序中, x>=y 不成立會(huì)返回 false , x<=y 成立,會(huì)返回 true 。運(yùn)行結(jié)果:
邏輯運(yùn)算符用來(lái)連接多個(gè) bool 類型表達(dá)式,實(shí)現(xiàn)多個(gè)條件的復(fù)合判斷。C#中的邏輯運(yùn)算符包括:邏輯非( ! )、邏輯與( && )、邏輯或( || )。
邏輯非用來(lái)對(duì)某一個(gè) bool 類型表達(dá)式取反,即“真變假”或“假變真”。請(qǐng)看下面的代碼:
Console.WriteLine(1 > 0);//條件表達(dá)式為true,輸出TrueConsole.WriteLine(!(1 > 0));//用邏輯非對(duì)條件表達(dá)式取反,輸出False
邏輯與用來(lái)判斷 2 個(gè) bool 類型表達(dá)式是否同時(shí)為 true 。請(qǐng)看下面的代碼:
int x = 5, y = 2;//同時(shí)聲明2個(gè)int型變量并賦值Console.WriteLine(x>3 && y>3);//判斷x>3和y>3是否同時(shí)為true,由于y>3為false,所以整個(gè)表達(dá)式為false
只有當(dāng)&&兩邊的表達(dá)式均為 true 時(shí),整個(gè)表達(dá)式才為 true ;若任意一個(gè)表達(dá)式為 false ,整個(gè)表達(dá)式即為 false 。
邏輯或用來(lái)判斷2個(gè) bool 類型表達(dá)式中是否有一個(gè)為 true 。請(qǐng)看下面的代碼:
int x = 5, y = 2;//同時(shí)聲明2個(gè)int型變量并賦值Console.WriteLine(x>3 || y>3);//判斷x>3和y>3是否有一個(gè)為true,由于x>3為true,所以整個(gè)表達(dá)式為true
只要||兩邊的表達(dá)式有一個(gè)為 true ,整個(gè)表達(dá)式即為 true ;若兩邊的表達(dá)式均為 false ,整個(gè)表達(dá)式為 false 。
對(duì)比一下,就是說(shuō): && 運(yùn)算符,兩邊同真才算真,一邊為假就算假; || 運(yùn)算符,一邊為真即為真,兩邊同假才是假。
作為對(duì)上一節(jié)學(xué)習(xí)的鞏固,這一節(jié)我們通過(guò)幾個(gè)示例熟悉邏輯運(yùn)算符的應(yīng)用。第一個(gè)示例是關(guān)于邏輯與,比如小張想結(jié)婚,未來(lái)丈母娘開(kāi)出的條件是:存款必須過(guò)10萬(wàn),必須有房子,這兩條少一條都不行。既然2個(gè)條件都是“必須”做到,那就需要同時(shí)滿足,適合用邏輯與連接:
運(yùn)行結(jié)果為:False
下一個(gè)示例是關(guān)于邏輯或,比如麗麗選擇男朋友的標(biāo)準(zhǔn),要么是“工程師”,要么是“運(yùn)動(dòng)員”,二者居其一即可:
運(yùn)行結(jié)果為:True
前面,我們已經(jīng)學(xué)過(guò)一個(gè)賦值運(yùn)算符“=”,這次我們學(xué)習(xí)一下其他的賦值運(yùn)算符:
加賦值“+=”:先加后賦值。請(qǐng)看下面的例子:
int x=5; x += 2;//這句等同于x=x+2;執(zhí)行后,x的值為7
減賦值“-=”:先減后賦值。請(qǐng)看下面的例子:
int x=5; x -= 2;//這句等同于x=x-2;執(zhí)行后,x的值為3
乘賦值“*=”:先乘后賦值。請(qǐng)看下面的例子:
int x=5; x *= 2;//這句等同于x=x*2;執(zhí)行后,x的值為10
除賦值“/=”:先除后賦值。請(qǐng)看下面的例子:
int x=5; x /= 2;//這句等同于x=x/2;執(zhí)行后,x的值為2
取余賦值“%=”:先取余后賦值。請(qǐng)看下面的例子:
int x=5; x %= 2;//這句等同于x=x%2;執(zhí)行后,x的值為1
與其他運(yùn)算符從左向右計(jì)算不同,賦值運(yùn)算符從右向左計(jì)算。
前面我們學(xué)習(xí)了那么多運(yùn)算符,如果編程中同時(shí)使用了多個(gè)運(yùn)算符,到底哪一個(gè)會(huì)先運(yùn)算呢?這就是優(yōu)先級(jí)的問(wèn)題。C#運(yùn)算符的優(yōu)先級(jí)請(qǐng)參考下面的順序:
①括號(hào)。學(xué)數(shù)學(xué)的時(shí)候我們就知道,要先計(jì)算括號(hào)里面的內(nèi)容。C#語(yǔ)言也是一樣,如果有多層括號(hào),要從里向外計(jì)算。括號(hào)優(yōu)先級(jí)最高。
②一元運(yùn)算符。有些運(yùn)算符兩邊有2個(gè)操作數(shù),比如2+3、6%5等等,這些叫做二元運(yùn)算符。只有一個(gè)操作數(shù)的叫做一元運(yùn)算符,它們的優(yōu)先級(jí)高于二元運(yùn)算符。一元運(yùn)算符包括:++(自加) 、 --(自減) 、 !(邏輯非)。
③*(乘)、/(除)、%(取余)。
④+(加)、-(減)。
⑤>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
⑥==(等于)、!=(不等于)。
⑦&&(邏輯與)。
⑧||(邏輯或)。
⑨賦值運(yùn)算符。包括:=、+=、-=、*=、/=、%=。
另外,還需要注意一點(diǎn):優(yōu)先級(jí)相同的運(yùn)算符從左向右計(jì)算(賦值運(yùn)算符相反)。
請(qǐng)看下面這段代碼:
bool b = 20 - (15 - 8) * 2 > 10 && (2 % 2 * 2 + 2) > 2; Console.WriteLine(b);
分析:首先計(jì)算優(yōu)先級(jí)最高的括號(hào),(15-8)得到7,(2%2*2+2)則需要先計(jì)算%和*,后算+,結(jié)果是2,表達(dá)式就變成了:
bool b=20-7*2>10&&2>2;
接下來(lái)優(yōu)先級(jí)最高的是7*2,然后是減法,變成:
bool b=6>10&&2>2;
繼續(xù)計(jì)算兩個(gè)大于號(hào),得到:
bool b=false&&false;
最后的結(jié)果當(dāng)然是false:
流程圖是程序步驟的圖形化表示方法。流程圖中包括如下符號(hào):
以上圖形中,流程線用來(lái)連接相鄰的兩個(gè)步驟;每一個(gè)程序都有且僅有一個(gè)開(kāi)始和結(jié)束。
以下流程圖描述的是,求2個(gè)浮點(diǎn)數(shù)的和,后邊是用C#實(shí)現(xiàn):
走到岔路口,需要選擇方向。編寫程序也會(huì)遇到判斷和分支。請(qǐng)看下面的流程圖,判斷手機(jī)賬戶余額是否不足10元,如果不足給出提示:
這個(gè)程序在“balance<10”這個(gè)步驟出現(xiàn)了分支,“balance<10”被稱為判斷( bool 類型),當(dāng)判斷為 true 時(shí),執(zhí)行左邊的分支,輸出提示;當(dāng)判斷為 false 時(shí),執(zhí)行右邊的分支,不輸出任何內(nèi)容。
在C#中,這個(gè)結(jié)構(gòu)成為條件結(jié)構(gòu),通常用 if 關(guān)鍵字來(lái)實(shí)現(xiàn):
當(dāng) if 右邊的判斷為 true 的時(shí)候,會(huì)執(zhí)行分支一;如果判斷為 false ,則不會(huì)執(zhí)行分支一。
前一節(jié)我們學(xué)習(xí)了 if 條件結(jié)構(gòu)。條件結(jié)構(gòu)可以有2個(gè)分支,比如下面的流程圖,判斷一個(gè)整數(shù)是奇數(shù)還是偶數(shù):
這個(gè)流程圖從C#實(shí)現(xiàn)如下,其中,條件為 true 時(shí)執(zhí)行的分支寫在 if() 后面的{}中;條件為 false 時(shí)執(zhí)行的分支寫在 else 后面的{}中。
這個(gè)由 if 和 else 組成的結(jié)構(gòu)是條件結(jié)構(gòu)的一種,它的基本邏輯是:當(dāng)條件為 true 時(shí),執(zhí)行分支1,否則,執(zhí)行分支2。這段程序中,變量num能夠被2整除時(shí)會(huì)執(zhí)行分支1,不能被2整除時(shí)執(zhí)行分支2。程序的運(yùn)行結(jié)果是:
每一個(gè) if...else 結(jié)構(gòu)都包含 1 個(gè)條件和 2 個(gè)分支,而程序會(huì)根據(jù)條件的真與假,選擇執(zhí)行其中的某一個(gè)分支。條件必須為 bool 類型的表達(dá)式。
程序開(kāi)發(fā)中,往往需要先判斷一個(gè)條件是否成立,再判斷另一個(gè)條件。比如下面的例子:驗(yàn)證賬號(hào)是否為“admin”,如果不是則提示錯(cuò)誤;如果是,則驗(yàn)證密碼是否為“bj2022”:
用C#實(shí)現(xiàn)如下:
外層的if (userName == "admin")
會(huì)被首先判斷,如果為 false ,就會(huì)輸出“用戶名錯(cuò)誤!”;如果為 true ,再判斷內(nèi)層的if (password == "bj2022")
如果,有多個(gè)條件,其中只有一個(gè)成立,應(yīng)該怎樣判斷呢?比如小明考試,90分以上獎(jiǎng)勵(lì)一臺(tái)手機(jī),80-89分獎(jiǎng)勵(lì)一個(gè)滑板,60-79分獎(jiǎng)勵(lì)一個(gè)燒餅,60以下沒(méi)有獎(jiǎng)勵(lì),0-100的分?jǐn)?shù)被劃分為4檔,需要做3次條件判斷。如果用上一節(jié)學(xué)習(xí)的嵌套if結(jié)構(gòu)完成,3層if的嵌套會(huì)使程序變得很復(fù)雜。本節(jié)我們使用多重 if 結(jié)構(gòu)實(shí)現(xiàn),它的基本語(yǔ)法為:
程序運(yùn)行時(shí),將從上到下依次判斷條件,若某個(gè)條件為 true ,則執(zhí)行對(duì)應(yīng)的分支,并且停止后面條件的判斷。比如下面的代碼,將輸出“獎(jiǎng)勵(lì)一個(gè)燒餅”:
if...else 條件結(jié)構(gòu)中,如果某個(gè)分支只包含一條命令,那么是可以省略大括號(hào){}的。比如上一節(jié)的練習(xí),可以簡(jiǎn)化為:
請(qǐng)注意,如果分支中包含2條以上的命令,是不能省略{}的。
如果 if 和 else 比較多,又省略了{(lán)},怎么判斷那一個(gè) if 和哪一個(gè) else 是一對(duì)呢?請(qǐng)看下面的代碼:
當(dāng)出現(xiàn)多個(gè) if 和 else ,又沒(méi)有{}來(lái)界定范圍時(shí),請(qǐng)參考下面2條原則:
①每一個(gè) else 與前面離它最近的 if 配對(duì)。按照這個(gè)原則,上面示例代碼的兩個(gè) else 都與第二個(gè) if 配對(duì),這顯然是不可能的,于是又有了第二個(gè)原則。
②多個(gè) else 都與同一個(gè) if 相近時(shí),最內(nèi)層的 else 優(yōu)先配對(duì)。這樣,第一個(gè) else 處于內(nèi)層,就與第二個(gè) if 優(yōu)先配對(duì),第二個(gè) else 只能與第一個(gè) if 配對(duì)。上面的示例代碼會(huì)輸出“C”。
根據(jù)這兩個(gè)原則,上面的代碼等同于如下的規(guī)范代碼:
編寫條件結(jié)構(gòu)時(shí),盡可能加上 {} 可以省掉不必要的錯(cuò)誤和麻煩。
C#提供了一種條件運(yùn)算符,能夠代替簡(jiǎn)單的 if...else 結(jié)構(gòu)。這種條件運(yùn)算符的語(yǔ)法如下:
條件表達(dá)式 ? 分支1 : 分支2
?: 就是條件運(yùn)算符,可以看到它有3個(gè)操作數(shù),所以又被稱為三元運(yùn)算符。它的運(yùn)算邏輯是:當(dāng)條件表達(dá)式為 true 時(shí),執(zhí)行分支1;當(dāng)條件表達(dá)式為 false 時(shí),執(zhí)行分支2。
下面的例子中,根據(jù)年齡的大小,輸出“成年人”或“未成年人”:
因?yàn)?code>age=17,所以條件表達(dá)式age>=18
的值為 false ,返回“未成年人”。
if...else 之外,C#中還有一種 switch 條件結(jié)構(gòu),可以用來(lái)對(duì)變量進(jìn)行多個(gè)分支的等值判斷。語(yǔ)法如下:
(變量)與每一個(gè) case 后面的常量進(jìn)行等值比較,如果相等,就執(zhí)行對(duì)應(yīng)的分支。執(zhí)行分支以后, break 關(guān)鍵字會(huì)使 switch 結(jié)構(gòu)中止,不會(huì)再判斷后面的常量。如果變量與所有的常量都不相同,則執(zhí)行 default 后面的分支。
下面的代碼,根據(jù)運(yùn)算符完成了四則運(yùn)算中的一項(xiàng):
上面的代碼,因?yàn)樽兞縪per的值與 case '*' 匹配,所以會(huì)輸出乘積“18”。
switch 中的(變量)只能是3種類型:整型(如 int )、字符型( char )、字符串類型( string )。
程序連續(xù)的重復(fù)一個(gè)步驟稱為“循環(huán)”。循環(huán)可以簡(jiǎn)化我們的代碼,減少冗余。例如,打印 1-10 的整數(shù),我們可以寫 10 條打印語(yǔ)句,也可以這樣:
這個(gè)循環(huán)結(jié)構(gòu),會(huì)首先判斷 x<=10 ,條件為真時(shí)執(zhí)行循環(huán)體(“輸出x”和“x++”),之后,再次判斷條件 x<=10 ,若條件為真則繼續(xù)執(zhí)行循環(huán)體......若條件為假,則結(jié)束循環(huán)。
簡(jiǎn)單的說(shuō),循環(huán)是由循環(huán)體(需要重復(fù)執(zhí)行的命令)和循環(huán)條件組成的。運(yùn)行時(shí),先判斷循環(huán)條件,若條件為 true ,就執(zhí)行循環(huán)體一次,然后再判斷條件...當(dāng)條件為 false 時(shí),結(jié)束循環(huán)。上面的流程圖,當(dāng)變量 x 累加到 11 時(shí),循環(huán)條件為 false ,循環(huán)就會(huì)結(jié)束。
C#中,可以用 while 循環(huán)結(jié)構(gòu)來(lái)實(shí)現(xiàn):
對(duì)比代碼和流程圖可知, while 循環(huán)結(jié)構(gòu)中,循環(huán)條件寫在 () 中,循環(huán)體寫在 {} 中。運(yùn)行結(jié)果:
這一節(jié),我們學(xué)習(xí)用循環(huán)累加的方式求和。
上一節(jié),我們?cè)?jīng)循環(huán)打印過(guò) 1-10 的整數(shù),如果聲明一個(gè)變量,在打印的過(guò)程中,把每一個(gè)數(shù)字都累加到變量里面,就可以得到 1-10 的和。求和算法的基本步驟:
①聲明變量 sum 用來(lái)存儲(chǔ)“和”。 sum 的初始值賦為 0 。
②循環(huán),用變量 x 訪問(wèn)每一個(gè)數(shù)字,用 sum+=x 的方式累加。(即 sum=sum+x; )
③循環(huán)結(jié)束后, sum 中存儲(chǔ)的即是和。
運(yùn)行結(jié)果如下:
前面已經(jīng)學(xué)習(xí)了 while 循環(huán),C#中還有一種非常有用的 for 循環(huán),特別適合于“已知循環(huán)次數(shù)”的循環(huán)。
比如,循環(huán)打印3次“我能行!”,用 while 循環(huán)可以這樣寫:
而用 for 循環(huán)這樣寫:
可以看出來(lái), while 循環(huán)有的變量聲明、循環(huán)條件、變量自加, for 循環(huán)一個(gè)也不缺,但是 for 循環(huán)把這些跟循環(huán)次數(shù)有關(guān)的元素都放在 ( ; ; ) 中,使得{}中的循環(huán)體更加純粹,程序結(jié)構(gòu)更加清晰。
* for 循環(huán) ( ; ; ) 中的兩個(gè)分號(hào)是不能缺少的。
for 循環(huán)運(yùn)行時(shí),首先進(jìn)行變量聲明和賦值;接下來(lái)判斷循環(huán)條件,若條件為 true ,則執(zhí)行循環(huán)體一次,若條件為 false ,則結(jié)束循環(huán);執(zhí)行循環(huán)體后,進(jìn)行變量自加。然后會(huì)進(jìn)入下一次循環(huán)。
C#中, do...while 循環(huán)也是一種常用的循環(huán)結(jié)構(gòu)。循環(huán)結(jié)構(gòu)各部分運(yùn)行順序如下:
從上面的示意可以看出, do...while 循環(huán)第一次執(zhí)行循環(huán)體是沒(méi)有經(jīng)過(guò)條件判斷的,也就是說(shuō)會(huì)無(wú)條件的執(zhí)行一次循環(huán)體,此后的邏輯
順序就與while循環(huán)相同了——先判斷條件,條件為true再執(zhí)行循環(huán)體一次。請(qǐng)看下面的例子:
盡管循環(huán)條件始終為 false ,但由于 do...while 循環(huán)第一次執(zhí)行循環(huán)體不判斷條件,所以循環(huán)體還是執(zhí)行了一次。運(yùn)行結(jié)果為:
我們已經(jīng)學(xué)習(xí)了C#中最常用的三種循環(huán)結(jié)構(gòu),下面我們小小總結(jié)一下:
循環(huán)中可以應(yīng)用 continue 關(guān)鍵字中止一次循環(huán),直接進(jìn)入下一次。請(qǐng)看下面的例子:
當(dāng)程序執(zhí)行到到 continue; 的時(shí)候,會(huì)立即停止本次循環(huán)體,直接進(jìn)入下一次循環(huán)。所以,第三行輸出比其他行少一些:
所以,可以使用 continue 關(guān)鍵字,在循環(huán)中剔除一些特殊的數(shù)據(jù)。
前面學(xué)習(xí) switch 結(jié)構(gòu)時(shí),我們?cè)?jīng)遇到過(guò) break 關(guān)鍵字, break 在 switch 結(jié)構(gòu)的作用是“跳出 switch 結(jié)構(gòu)”。
break 關(guān)鍵字還可以用在循環(huán)中,作用是“結(jié)束循環(huán)”。下面的循環(huán)代碼中,當(dāng) x==3 的時(shí)候會(huì)執(zhí)行 break :
運(yùn)行結(jié)果:
對(duì)比代碼和運(yùn)行結(jié)果可知,當(dāng)執(zhí)行到 break ,循環(huán)結(jié)束(盡管此時(shí)循環(huán)條件仍然為 true )。
利用 break 關(guān)鍵字和 true 關(guān)鍵字,我們可以用另一種方式編寫循環(huán),下面的代碼是輸出1-5的整數(shù):
運(yùn)行結(jié)果:
在一個(gè)循環(huán)體中包含另一個(gè)循環(huán),稱為“嵌套循環(huán)”。當(dāng)2個(gè)循環(huán)嵌套的時(shí)候,外層循環(huán)體執(zhí)行一次,內(nèi)層循環(huán)體執(zhí)行 n 次( n 是內(nèi)層循環(huán)的次數(shù))。請(qǐng)看下面的例子:
運(yùn)行結(jié)果:
比較代碼和運(yùn)行結(jié)果,我們發(fā)現(xiàn),內(nèi)層循環(huán)體執(zhí)行 3 次,外層循環(huán)體執(zhí)行 1 次。這就有點(diǎn)像鐘表上的時(shí)針和分針——時(shí)針走一格,分針走一圈。
下面一段代碼打印了一個(gè)矩形:
運(yùn)行效果:
請(qǐng)思考一下,哪一個(gè)變量決定了每一行的循環(huán)次數(shù), x 還是 y ?
編程中有這樣一種情形:我們需要存儲(chǔ)多個(gè)同類型數(shù)據(jù)。比如,保存 1600 個(gè)學(xué)生的年齡。是否需要聲明 1600 個(gè) int 類型的變量?過(guò)了一年,學(xué)生們長(zhǎng)了 1 歲,是否需要給每個(gè)變量重新賦值?這件事情,想想就怕怕。好在C#中有一種數(shù)組,專門存儲(chǔ)一組相同類型的數(shù)據(jù)。數(shù)組的聲明和初始化語(yǔ)法如下:
數(shù)據(jù)類型[ ] 數(shù)組名 = new 數(shù)據(jù)類型[長(zhǎng)度];
注意:數(shù)組名像變量名一樣要遵循標(biāo)識(shí)符的命名規(guī)則;長(zhǎng)度必須是整數(shù)
下面我們來(lái)比較變量和數(shù)組的聲明與初始化,右邊是在內(nèi)存中為變量和數(shù)組分配空間的示意:
對(duì)比變量 x 和數(shù)組 y 就會(huì)發(fā)現(xiàn),數(shù)組 y 中其實(shí)包含了 3 個(gè) double 類型的變量,為什么是 3 個(gè)?因?yàn)槌跏蓟瘮?shù)組時(shí)在 [ ] 中聲明的長(zhǎng)度為 3 。既然都在數(shù)組 y 中,所以 3 個(gè)變量(應(yīng)該叫數(shù)組元素)的名字都叫 y ,為了區(qū)分它們,按照順序給它們加上索引 [0]、[1]、[2] 。請(qǐng)注意:數(shù)組的索引從 0 開(kāi)始遞增。那么,數(shù)組 y 中 3 個(gè)元素的名字就變成了 y[0]、y[1]、y[2] 。最后再注意一點(diǎn):數(shù)組經(jīng)過(guò)初始化以后,數(shù)組元素有默認(rèn)的初始值, double 類型為 0.0 , int 類型為 0 , char 類型為 'a' , bool 類型為 false , string 類型為 null 。
數(shù)組元素的賦值與普通變量相同。下面的示例中,我們聲明了一個(gè)長(zhǎng)度為 3 的 string 類型數(shù)組,逐個(gè)賦值,然后打印:
上例中,需要注意的是元素的索引,數(shù)組元素索引從 0 開(kāi)始遞增,所以長(zhǎng)度為 3 的數(shù)組,其元素索引為 [0]、[1]、[2] 。
如何知道一個(gè)數(shù)組的長(zhǎng)度呢? 數(shù)組.Length 屬性會(huì)返回?cái)?shù)組的長(zhǎng)度(即數(shù)組元素的個(gè)數(shù))。請(qǐng)看下面的例子:
代碼中的 friends.Length 會(huì)返回 friends 數(shù)組的長(zhǎng)度,請(qǐng)看運(yùn)行結(jié)果:
上一節(jié)我們學(xué)習(xí)了數(shù)組的聲明和初始化,以及數(shù)組元素的訪問(wèn)方法。其實(shí),C#中數(shù)組元素有多種初始化方式,請(qǐng)看下例:
上例中,數(shù)組 a 的初始化方式我們已經(jīng)學(xué)習(xí)過(guò)了;數(shù)組 b、c、d 是在初始化時(shí)為數(shù)組元素指定初始值,請(qǐng)注意數(shù)組 d 用 [3] 聲明了數(shù)組長(zhǎng)度,后面 { } 中的初始值個(gè)數(shù)要與 [ ] 中聲明的長(zhǎng)度相同。數(shù)組 b、c 初始化沒(méi)有聲明長(zhǎng)度,長(zhǎng)度由 { } 中的初始值個(gè)數(shù)確定。
上一節(jié)我們還學(xué)習(xí)了數(shù)組的一個(gè)屬性 Length , Length 能夠返回?cái)?shù)組的長(zhǎng)度,利用它和數(shù)組元素的索引,我們可以循環(huán)訪問(wèn)每一元素。上一節(jié)中打印名字的代碼,可以這樣改進(jìn):
Length 屬性返回?cái)?shù)組的長(zhǎng)度,如上例中,數(shù)組長(zhǎng)度為 3 , Length 就返回 3 ,即循環(huán)變量 i 從 0 循環(huán)到 2 。為什么不循環(huán)到 3 呢?因?yàn)閿?shù)組元素的索引是從 0 開(kāi)始的呀!長(zhǎng)度為 3 的數(shù)組,索引為 0 - 2 。
通過(guò)上例,我們看到,使用數(shù)組就能循環(huán)訪問(wèn)一組相同類型的變量了,是不是比使用單個(gè)變量要輕松呢?
for 循環(huán)使我們可以通過(guò)索引訪問(wèn)數(shù)組元素;而 foreach 循環(huán)則可以不依賴索引而讀取每一個(gè)數(shù)組元素。下面的示例代碼聲明了一個(gè)整型數(shù)組,然后通過(guò)兩種方法打印數(shù)組元素:
運(yùn)行結(jié)果是相同的:
使用 foreach 的語(yǔ)法:
需要解釋一下 ④ ,如上面的示例代碼,迭代變量 x 只能用于讀取數(shù)組 num 中的值,但是不能給數(shù)組元素賦值,如果嘗試給 x 賦值,則會(huì)有下面的錯(cuò)誤提示:
了解了 foreach 循環(huán)的語(yǔ)法,你可能會(huì)有疑問(wèn):好像 foreach 循環(huán)能做的 for 都能做, foreach 存在的意義是什么呢?其實(shí),C#中還存在一些類似于數(shù)組的數(shù)據(jù)組織方式,它們中有一些是沒(méi)有元素索引的,對(duì)于這些元素,只能通過(guò) foreach 遍歷。關(guān)于那些更高級(jí)的對(duì)象,我們留待后面的課程介紹。
二維數(shù)組,就是以數(shù)組作為元素的數(shù)組。挺拗口的,看看它跟一維數(shù)組的對(duì)比:
左邊的 a 是一維數(shù)組,數(shù)組中包含 4 個(gè) int 型變量:a[0]、a[1]、a[2]、a[3] 。
右邊的 b 是二維數(shù)組,數(shù)組中包含 2 個(gè) int 型一維數(shù)組:b[0]、b[1] 。而 b[0] 和 b[1] 中又分別包含 3 個(gè) int 型變量:b[0,0]、b[0,1]、b[0,2]、b[1,0]、b[1,1]、b[1,2] 。
總結(jié)一下,二維數(shù)組這樣聲明:
int[,] arr = new int[2,3]; //包含2個(gè)一維數(shù)組,每個(gè)一維數(shù)組包含3個(gè)變量,總共2*3=6個(gè)數(shù)組元素
二維數(shù)組元素這樣賦值和打?。?/p>
arr[1,0] = 28; //二維數(shù)組元素有2個(gè)索引,都是從0開(kāi)始,以arr數(shù)組為例,元素索引從[0,0]到[1,2]Console.Write( arr[1,0] );
我們可以用二維數(shù)組管理相關(guān)的數(shù)據(jù),比如有 4 名同學(xué)參加語(yǔ)文和數(shù)學(xué)兩門考試,我們用二維數(shù)組存儲(chǔ)他們的成績(jī),每位同學(xué)的 2 門課分?jǐn)?shù),存儲(chǔ)在一個(gè)一維數(shù)組中:
運(yùn)行結(jié)果如下:
通常C++中會(huì)對(duì)類中的屬性設(shè)置成private,然后對(duì)可以修改的對(duì)象單獨(dú)寫一個(gè)修改值的方法,但C#則大大簡(jiǎn)化了這個(gè)步驟
這是C++、Java里面沒(méi)有的東西。
注意命名規(guī)則 _name ----> Name
C#z中:字段是類中原始的成員對(duì)象,通常是私有的,屬性是對(duì)字段的封裝,通常是公有的
class Child { private string _sex; //隱藏字段 public string Sex //公開(kāi)屬性 { get { return _sex; } //讀訪問(wèn)器 set { _sex = value; } //寫訪問(wèn)器 } }
使用:
Child LaoWang = new Child(); LaoWang.Sex = "male"; Console.WriteLine(LaoWang.Sex);
補(bǔ)充:字段封裝的快捷鍵: 光標(biāo)放在字段內(nèi),CTRL + R + E
對(duì)Set訪問(wèn)器進(jìn)行檢查:
public string Sex //公開(kāi)屬性 { get { return _sex; } //讀訪問(wèn)器 set { if(value == "man" && value != "woman") { _sex = value; } } //寫訪問(wèn)器 }
使用:
Child child = new Child {Name = "小明", Age = 5};
值類型: int char double bool ...
值類型變量存儲(chǔ)對(duì)象的值,賦值會(huì)創(chuàng)建值的副本,修改任何一個(gè)副本,都不會(huì)影響到其他的副本
引用類型: 類、數(shù)組、接口
struct class的區(qū)別:
struct不允許定義無(wú)參構(gòu)造函數(shù)
默認(rèn)訪問(wèn)限定符不同
struct中可以不實(shí)例化而直接訪問(wèn)成員方法
在下面這種情況:
class Child { public Child(String sex) { _sex = sex; } private String _sex; public string Sex { get { return _sex; } set { if (value == "男" || value == "女") { _sex = value; } } } }
這樣寫是沒(méi)有問(wèn)題的,將性別限制成了“男”、“女”兩種情況
但如果是星座呢? 星座有12種,難道要全部用if判斷嗎?
這個(gè)地方,就可以用枚舉
代碼如下:
enum Constell { 白羊,水瓶,金牛,摩羯 } class Child { Child(Constell con) { _con = con; } private Constell _con; internal Constell Con { get { return _con; } set { _con = value; } } }
和C++不同,默認(rèn)傳遞方式取決于傳遞的參數(shù)是值類型還是引用類型
另外傳遞方式略有差異,需要在調(diào)用處和函數(shù)定義處均聲明,如:
MySwap(ref val1, ref val2);
(個(gè)人覺(jué)得這樣比C++好用許多)
out用來(lái)聲明參數(shù)為輸出型參數(shù)。
同樣,在函數(shù)的定義處和調(diào)用處,都要用out關(guān)鍵字聲明要修飾的變量
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C#基礎(chǔ)知識(shí)的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。