表達(dá)式
表達(dá)式由操作數(shù) (operand) 和運(yùn)算符 (operator) 構(gòu)成遏片。表達(dá)式的運(yùn)算符指示對(duì)操作數(shù)適用什么樣的運(yùn)算。運(yùn)算符的示例包括+撮竿、-吮便、* 、/ 和 new幢踏。操作數(shù)的示例包括文本髓需、字段、局部變量和表達(dá)式房蝉。
當(dāng)表達(dá)式包含多個(gè)運(yùn)算符時(shí)僚匆,運(yùn)算符的優(yōu)先級(jí) (precedence) 控制各運(yùn)算符的計(jì)算順序。例如搭幻,表達(dá)式 x + y * z 按 x + (y * z) 計(jì)算咧擂,因?yàn)?* 運(yùn)算符的優(yōu)先級(jí)高于 + 運(yùn)算符。
語(yǔ)句
語(yǔ)句是程序的主體檀蹋,一般程序都是有很多個(gè)語(yǔ)句組成的松申,C#中的語(yǔ)句主要分為以下幾種:
聲明語(yǔ)句 (declaration statement)?用于聲明局部變量和常量。
表達(dá)式語(yǔ)句 (expression statement)?用于對(duì)表達(dá)式求值续扔」ネ危可用作語(yǔ)句的表達(dá)式包括方法調(diào)用、使用 new 運(yùn)算符的對(duì)象分配纱昧、使用 = 和復(fù)合賦值運(yùn)算符的賦值刨啸、使用 ++ 和 -- 運(yùn)算符的增量和減量運(yùn)算以及 await 表達(dá)式。
選擇語(yǔ)句 (selection statement)?用于根據(jù)表達(dá)式的值從若干個(gè)給定的語(yǔ)句中選擇一個(gè)來執(zhí)行识脆。這一組中有 if 和 switch 語(yǔ)句设联。
迭代語(yǔ)句 (iteration statement)?用于重復(fù)執(zhí)行嵌入語(yǔ)句善已。這一組中有 while、do离例、for 和 foreach 語(yǔ)句换团。
跳轉(zhuǎn)語(yǔ)句 (jump statement)?用于轉(zhuǎn)移控制。這一組中有 break宫蛆、continue艘包、goto、throw耀盗、return 和 yield 語(yǔ)句想虎。
try...catch語(yǔ)句?用于捕獲在塊的執(zhí)行期間發(fā)生的異常,try...finally 語(yǔ)句用于指定終止代碼叛拷,不管是否發(fā)生異常舌厨,該代碼都始終要執(zhí)行。
checked 語(yǔ)句和 unchecked 語(yǔ)句?用于控制整型算術(shù)運(yùn)算和轉(zhuǎn)換的溢出檢查上下文忿薇。
lock 語(yǔ)句?用于獲取某個(gè)給定對(duì)象的互斥鎖裙椭,執(zhí)行一個(gè)語(yǔ)句,然后釋放該鎖署浩。
using 語(yǔ)句?用于獲得一個(gè)資源揉燃,執(zhí)行一個(gè)語(yǔ)句,然后釋放該資源瑰抵。
聲明語(yǔ)句
聲明語(yǔ)句的主要的作用就是聲明一個(gè)變量你雌,在C#中主要的聲明方法如下:
intx=1;//聲明整型變量doublex=1.0;//聲明雙精度變量int[]array={1,2,3};//聲明數(shù)組變量int[]array=newint[4]{1,2,3,4};//聲明數(shù)組變量string s="abcd";//聲明字符串變量var x=10;//這個(gè)是讓編譯器自己去判斷x是什么類型的變量enumcolor//聲明枚舉變量{red,blue,green};constinta=10;//聲明常量
表達(dá)式語(yǔ)句
在C#中像x+y;和100;這樣的表達(dá)式是不允許存在的二汛,因?yàn)闆]有意義婿崭,但是C語(yǔ)言是可以存在的,雖然也沒有意義
選擇語(yǔ)句
這里主要看Switch語(yǔ)句肴颊,它的主要結(jié)構(gòu)是:
switch(表達(dá)式){case常量標(biāo)簽1:語(yǔ)句塊1氓栈;break;case常量標(biāo)簽2:語(yǔ)句塊2;break;case常量標(biāo)簽3:語(yǔ)句塊3婿着;break;default:break;}
首先看括號(hào)里的表達(dá)式授瘦,它的要求是得到的結(jié)果必須是以下類型:
sbyte、byte竟宋、short提完、ushort、int丘侠、uint徒欣、long、ulong蜗字、bool打肝、char脂新、string 或
enum-type
注意,這里面沒有浮點(diǎn)數(shù)粗梭,所以這里表達(dá)式的結(jié)果必須是整數(shù)争便,布爾,字符断医,字符串滞乙,枚舉類型**
下面看這些常量標(biāo)簽,這些標(biāo)簽要跟之前的表達(dá)式的值想對(duì)應(yīng)鉴嗤,比如表達(dá)式的結(jié)果是布爾類型酷宵,那么這些標(biāo)簽常量也要是布爾類型的
迭代語(yǔ)句
迭代語(yǔ)句主要就是用于循環(huán)使用,其中for循環(huán)和while循環(huán)和C語(yǔ)言差不多躬窜,這里主要講一下foreach,其結(jié)構(gòu)如下:
foreach (var item in collection) { 語(yǔ)句塊炕置; }
這個(gè)語(yǔ)句的意思是荣挨,用item去訪問collection里的元素,每訪問到一個(gè)就執(zhí)行一次語(yǔ)句塊朴摊,注意這個(gè)collection必須是個(gè)集合
什么樣的集合是可以使用foreach語(yǔ)句進(jìn)行迭代的呢默垄?
如果說一個(gè)集合它具有IEnumerable這個(gè)接口,那么他就可以使用foeeach語(yǔ)句進(jìn)行迭代
比如:
注:圈起來的冒號(hào)后面表示這個(gè)類的基類和基接口
下面講講foreach語(yǔ)句的原理甚纲,首先看看迭代器IEnumerator的使用
image.png
class Program{staticvoidMain(string[]args){int[]myArray=newint[]{1,2,3,4,5,6};IEnumerator Enumerable=myArray.GetEnumerator();//由于IEnumerable是數(shù)組的基接口口锭,所以這個(gè)接口的方法,數(shù)組也可以使用while(Enumerable.MoveNext()){Console.WriteLine(Enumerable.Current);}}}
所以foreach語(yǔ)句的本質(zhì)就是對(duì)這種使用迭代器對(duì)集合遍歷的方法的簡(jiǎn)記法
try...catch語(yǔ)句
這語(yǔ)句是為了防止出現(xiàn)異常介杆,將要可能會(huì)出現(xiàn)異常的代碼塊放大try中鹃操,如果出現(xiàn)了異常,將會(huì)進(jìn)入到catch語(yǔ)句中春哨,對(duì)于異常往往會(huì)不止一種荆隘。比如int里有一個(gè)Parse方法,使用這個(gè)方法是將字符串解析成相應(yīng)格式的值赴背,但是使用過程中就可能出現(xiàn)輸入的字符串為空椰拒,和不能轉(zhuǎn)成整型的字符,或者大于整型的最大值凰荚,這幾種情況燃观,這個(gè)時(shí)候就會(huì)出現(xiàn)異常
image.png
所以這個(gè)時(shí)候catch的分支可能就不止一個(gè),但是它只能執(zhí)行一個(gè)便瑟,因?yàn)檫\(yùn)行try時(shí)在某個(gè)時(shí)刻出現(xiàn)了一個(gè)異常就直接跳到相應(yīng)的catch分支里了缆毁,當(dāng)然也可以只用一個(gè)分支這樣無論是哪種異常都會(huì)進(jìn)入這個(gè)分支里
staticvoidMain(string[]args){string s;s=Console.ReadLine();if(s=="null"){s=null;}try{intx;x=int.Parse(s);x++;Console.WriteLine(x);}catch(ArgumentNullException)//這個(gè)括號(hào)里寫的就是異常的名稱,也可以不寫胳徽,不寫就是有異常就會(huì)到這個(gè)分支來{Console.WriteLine("The exception is ArgumentNullException!");}catch(FormatException){Console.WriteLine("The exception is FormatException!");}catch(OverflowException){Console.WriteLine("The exception is OverflowException!");}}
運(yùn)行結(jié)果如下:
image.png
對(duì)于try·····catch語(yǔ)句還可以加個(gè)finally分支在最后积锅,這個(gè)分支是不管有沒有異常都會(huì)進(jìn)行的
checked 語(yǔ)句和 unchecked 語(yǔ)句
這語(yǔ)句主要就是檢查checked語(yǔ)句所包含的代碼塊是否有溢出爽彤,默認(rèn)情況所寫的代碼都是處于unchecked語(yǔ)句里的