表達式
表達式由操作數(shù) (operand) 和運算符 (operator) 構成。表達式的運算符指示對操作數(shù)適用什么樣的運算。運算符的示例包括+、-、* 、/ 和 new。操作數(shù)的示例包括文本、字段、局部變量和表達式。
當表達式包含多個運算符時,運算符的優(yōu)先級 (precedence) 控制各運算符的計算順序。例如,表達式 x + y * z 按 x + (y * z) 計算,因為 * 運算符的優(yōu)先級高于 + 運算符。
語句
語句是程序的主體,一般程序都是有很多個語句組成的,C#中的語句主要分為以下幾種:
聲明語句 (declaration statement) 用于聲明局部變量和常量。
表達式語句 (expression statement) 用于對表達式求值??捎米髡Z句的表達式包括方法調(diào)用、使用 new 運算符的對象分配、使用 = 和復合賦值運算符的賦值、使用 ++ 和 -- 運算符的增量和減量運算以及 await 表達式。
選擇語句 (selection statement) 用于根據(jù)表達式的值從若干個給定的語句中選擇一個來執(zhí)行。這一組中有 if 和 switch 語句。
迭代語句 (iteration statement) 用于重復執(zhí)行嵌入語句。這一組中有 while、do、for 和 foreach 語句。
跳轉(zhuǎn)語句 (jump statement) 用于轉(zhuǎn)移控制。這一組中有 break、continue、goto、throw、return 和 yield 語句。
try...catch語句 用于捕獲在塊的執(zhí)行期間發(fā)生的異常,try...finally 語句用于指定終止代碼,不管是否發(fā)生異常,該代碼都始終要執(zhí)行。
checked 語句和 unchecked 語句 用于控制整型算術運算和轉(zhuǎn)換的溢出檢查上下文。
lock 語句 用于獲取某個給定對象的互斥鎖,執(zhí)行一個語句,然后釋放該鎖。
using 語句 用于獲得一個資源,執(zhí)行一個語句,然后釋放該資源。
聲明語句
聲明語句的主要的作用就是聲明一個變量,在C#中主要的聲明方法如下:
int x=1;//聲明整型變量
double x=1.0;//聲明雙精度變量
int[] array = {1,2,3};//聲明數(shù)組變量
int[] array = new int[4]{1,2,3,4};//聲明數(shù)組變量
string s="abcd";//聲明字符串變量
var x=10;//這個是讓編譯器自己去判斷x是什么類型的變量
enum color//聲明枚舉變量
{
red,
blue,
green
};
const int a=10;//聲明常量
表達式語句
在C#中像x+y;和100;這樣的表達式是不允許存在的,因為沒有意義,但是C語言是可以存在的,雖然也沒有意義
選擇語句
這里主要看Switch語句,它的主要結構是:
switch (表達式)
{
case 常量標簽1:
語句塊1;
break;
case 常量標簽2 :
語句塊2;
break;
case 常量標簽3:
語句塊3;
break;
default:
break;
}
首先看括號里的表達式,它的要求是得到的結果必須是以下類型:
sbyte、byte、short、ushort、int、uint、long、ulong、bool、char、string 或
enum-type
注意,這里面沒有浮點數(shù),所以這里表達式的結果必須是整數(shù),布爾,字符,字符串,枚舉類型**
下面看這些常量標簽,這些標簽要跟之前的表達式的值想對應,比如表達式的結果是布爾類型,那么這些標簽常量也要是布爾類型的
迭代語句
迭代語句主要就是用于循環(huán)使用,其中for循環(huán)和while循環(huán)和C語言差不多,這里主要講一下foreach,其結構如下:
foreach (var item in collection) { 語句塊; }
這個語句的意思是,用item去訪問collection里的元素,每訪問到一個就執(zhí)行一次語句塊,注意這個collection必須是個集合
什么樣的集合是可以使用foreach語句進行迭代的呢?
如果說一個集合它具有IEnumerable這個接口,那么他就可以使用foeeach語句進行迭代
比如:


注:圈起來的冒號后面表示這個類的基類和基接口
下面講講foreach語句的原理,首先看看迭代器IEnumerator的使用

class Program
{
static void Main(string[] args)
{
int[] myArray = new int[]{1,2,3,4,5,6};
IEnumerator Enumerable = myArray.GetEnumerator();//由于IEnumerable是數(shù)組的基接口,所以這個接口的方法,數(shù)組也可以使用
while (Enumerable.MoveNext())
{
Console.WriteLine(Enumerable.Current);
}
}
}
所以foreach語句的本質(zhì)就是對這種使用迭代器對集合遍歷的方法的簡記法
try...catch語句
這語句是為了防止出現(xiàn)異常,將要可能會出現(xiàn)異常的代碼塊放大try中,如果出現(xiàn)了異常,將會進入到catch語句中,對于異常往往會不止一種。比如int里有一個Parse方法,使用這個方法是將字符串解析成相應格式的值,但是使用過程中就可能出現(xiàn)輸入的字符串為空,和不能轉(zhuǎn)成整型的字符,或者大于整型的最大值,這幾種情況,這個時候就會出現(xiàn)異常
image.png
所以這個時候catch的分支可能就不止一個,但是它只能執(zhí)行一個,因為運行try時在某個時刻出現(xiàn)了一個異常就直接跳到相應的catch分支里了,當然也可以只用一個分支這樣無論是哪種異常都會進入這個分支里
static void Main(string[] args)
{
string s;
s=Console.ReadLine();
if (s == "null")
{
s = null;
}
try
{
int x;
x = int.Parse(s);
x++;
Console.WriteLine(x);
}
catch (ArgumentNullException)//這個括號里寫的就是異常的名稱,也可以不寫,不寫就是有異常就會到這個分支來
{
Console.WriteLine("The exception is ArgumentNullException!");
}
catch(FormatException)
{
Console.WriteLine("The exception is FormatException!");
}
catch(OverflowException)
{
Console.WriteLine("The exception is OverflowException!");
}
}
運行結果如下:

對于try·····catch語句還可以加個finally分支在最后,這個分支是不管有沒有異常都會進行的
checked 語句和 unchecked 語句
這語句主要就是檢查checked語句所包含的代碼塊是否有溢出,默認情況所寫的代碼都是處于unchecked語句里的
