目錄
C# 基礎(chǔ)語法??C# 語言是在 C、C++ 的基礎(chǔ)上發(fā)展而來的,因此在語法形式上有些類似。 C# 注釋符①注釋符的作用
②C#具有3種注釋符
C# 變量(Variable)變量的存儲(chǔ)變量用來在計(jì)算機(jī)當(dāng)中存儲(chǔ)數(shù)據(jù) 存儲(chǔ)變量的語法
注: 變量的基本數(shù)據(jù)類型
變量的使用規(guī)則如果你要是用變量的話,應(yīng)該先聲明再賦值最后使用。 變量的命名首先要保證的就是這個(gè)變量的名字要有意義。
注意
在滿足上面一系列的規(guī)則之外同時(shí)還要滿足這一系列的規(guī)范。
變量的作用域??變量的作用域就是你能夠使用到這個(gè)變量的范圍。 C# 運(yùn)算符由XX運(yùn)算符連接的表達(dá)式稱為XX表達(dá)式 賦值運(yùn)算符賦值運(yùn)算符中最常見的是等號(hào),除了等號(hào)以外還有很多賦值運(yùn)算符,它們通常都是與其他運(yùn)算符連用起到簡化操作的作用。
注意:每個(gè)表達(dá)式我們都可以求解出一個(gè)定義,對(duì)于賦值表達(dá)式而言,等號(hào)左邊的變量的值,就是整個(gè)賦值表達(dá)式的值。 復(fù)合賦值運(yùn)算符
|
運(yùn)算符 | 說明 |
---|---|
+ | 對(duì)兩個(gè)操作數(shù)做加法運(yùn)算 |
- | 對(duì)兩個(gè)操作數(shù)做減法運(yùn)算 |
* | 對(duì)兩個(gè)操作數(shù)做乘法運(yùn)算 |
/ | 對(duì)兩個(gè)操作數(shù)做除法運(yùn)算 |
% | 對(duì)兩個(gè)操作數(shù)做取余運(yùn)算 |
++ | x ++ 或 ++ x ,等同于x = x + 1 |
-- | x -- 或 -- x ,等同于x = x - 1 |
需要注意的是,++
和 --
運(yùn)算符放在操作數(shù)前和操作數(shù)后是有區(qū)別的,如果放在操作數(shù)前,需要先將操作數(shù)加 1 或減 1,然后再與其他操作數(shù)進(jìn)行運(yùn)算;如果放在操作數(shù)后,需要先與其他操作數(shù)進(jìn)行運(yùn)算,然后操作數(shù)自身再加 1。
前加加減減示例a = 2,b = ++a + 3
?
\longrightarrow
? a += 1, b = 3 + 3
后加加減減示例a = 2,b = a++ + 3
?
\longrightarrow
? b = 2 + 3, a += 1
對(duì)于像++
、--
這樣只需要一個(gè)操作數(shù)就能夠完成運(yùn)算的符號(hào),我們稱為一元運(yùn)算符。
對(duì)于+
、-
、*
、/
、%
這樣需要兩個(gè)或以上才能完成運(yùn)算的操作符,我們稱為二元運(yùn)算符。
一元運(yùn)算符的優(yōu)先級(jí)要高于二元運(yùn)算符。
如果在一個(gè)表達(dá)式當(dāng)中,既有一元運(yùn)算符,又有二元運(yùn)算符,我們首先計(jì)算一元運(yùn)算符。
關(guān)系運(yùn)算符是用來描述兩個(gè)事物之間的關(guān)系
關(guān)系表達(dá)式的結(jié)果是bool
類型
運(yùn)算符 | 說明 |
---|---|
== | 表示兩邊表達(dá)式運(yùn)算的結(jié)果相等,注意是兩個(gè)等號(hào) |
!= | 表示兩邊表達(dá)式運(yùn)算的結(jié)果不相等 |
> | 表示左邊表達(dá)式的值大于右邊表達(dá)式的值 |
< | 表示左邊表達(dá)式的值小于右邊表達(dá)式的值 |
>= | 表示左邊表達(dá)式的值大于等于右邊表達(dá)式的值 |
<= | 表示左邊表達(dá)式的值小于等于右邊表達(dá)式的值 |
在使用邏輯運(yùn)算符時(shí)需要注意邏輯運(yùn)算符兩邊的表達(dá)式以及返回的結(jié)果都是布爾類型的
運(yùn)算符 | 含義 | 說明 |
---|---|---|
&& | 邏輯與 | 如果運(yùn)算符兩邊都為 True,則整個(gè)表達(dá)式為 True,否則為 False;如果左邊操作數(shù)為 False,則不對(duì)右邊表達(dá)式進(jìn)行計(jì)算,相當(dāng)于“且”的含義 |
|| | 邏輯或 | 如果運(yùn)算符兩邊有一個(gè)或兩個(gè)為 True,整個(gè)表達(dá)式為 True,否則為 False;如果左邊為 True,則不對(duì)右邊表達(dá)式進(jìn)行計(jì)算,相當(dāng)于“或”的含義 |
! | 邏輯非 | 表示和原來的邏輯相反的邏輯 |
注:邏輯與的優(yōu)先級(jí)要高于邏輯或
if-else
的簡化寫法
語法
表達(dá)式1?表達(dá)式2:表達(dá)式3;
如果表達(dá)式1可以計(jì)算出true,那么表達(dá)式2的值就是整個(gè)三元表達(dá)式的值
如果表達(dá)式1可以計(jì)算出false,那么表達(dá)式3的值就是整個(gè)三元表達(dá)式的值
注意:表達(dá)式2的結(jié)果類型必須跟表達(dá)式3的結(jié)果類型一致,并且也要跟整個(gè)三元表達(dá)式的結(jié)果類型一致。
使用方法:先挖個(gè)坑,再填個(gè)坑;挖坑就是“,”后變量的個(gè)數(shù),填坑就是占位符的使用。從0開始依次遞增。
使用占位符需要注意的地方
Console.WriteLine('第一個(gè)數(shù)字是{0},第二個(gè)數(shù)字是{1},第三個(gè)數(shù)字是{2}', n1, n2, n3);
轉(zhuǎn)義符指的就是一個(gè)’ \ '+ 一個(gè)特殊的字符,組成了一個(gè)具有特殊意義的字符
轉(zhuǎn)義字符 | 等價(jià)字符 |
---|---|
\' | 單引號(hào) |
\' | 雙引號(hào) |
\\ | 反斜杠 |
\0 | 空 |
\a | 警告(產(chǎn)生鳴笛音) |
\b | 退格(放在字符串兩邊沒有效果) |
\f | 換頁 |
\n | 換行 |
\r | 回車 |
\t | 水平制表符 |
\v | 垂直制表符 |
@
符號(hào)\
在字符串中的轉(zhuǎn)義作用,使其單純的表示為一個(gè)\
Console.WriteLine(@'今天天氣好清涼
處處好風(fēng)光');
我們要求等號(hào)兩邊參與運(yùn)算的操作數(shù)的類型必須一致,如果不一致,滿足下列條件會(huì)發(fā)生自動(dòng)類型轉(zhuǎn)化,或者稱之為隱式類型轉(zhuǎn)換。
滿足下面兩個(gè)條件才能發(fā)生隱式類型轉(zhuǎn)換
int
和double
兼容(都是數(shù)字類型)double > int
滿足下面兩個(gè)條件才能發(fā)生顯式類型轉(zhuǎn)換
int
和double
兼容int < double
int number = 10; //int ---> double //目標(biāo)類型 = 源類型 double d = number; //自動(dòng)類型轉(zhuǎn)換 隱式類型轉(zhuǎn)換 double d1 = 303.6; //double ---> int //目標(biāo)類型 = (目標(biāo)類型)原類型 int n = (int)d1;//強(qiáng)制類型轉(zhuǎn)換,顯示類型轉(zhuǎn)換 Console.WriteLine(n); //303
string
和double
、int
不兼容。int
類型,而字符串'abc'看起來就不能轉(zhuǎn)成int
類型。Convert底層就是使用Parse,所以Parse也會(huì)拋異常,而TryParse轉(zhuǎn)化失敗不會(huì)拋異常
int.Parse('123abc');
double.Parse('123abc');
decimal.Parse('123abc');
int.TryParse('123abc');
double.TryParse('123abc');
decimal.TryParse('123abc');
所有類型都能夠轉(zhuǎn)換成string類型
//int n = 10;
//double n = 3.14;
//decimal n = 20000m;
QQstate n = QQstate.Busy;
string s = n.ToString();
Console.WriteLine(s);
??無論世界上有多少語言、又將出現(xiàn)多少語言,他們的骨架都是這三個(gè)結(jié)構(gòu)“順序結(jié)構(gòu)”、“選擇結(jié)構(gòu)”和“控制結(jié)構(gòu)”。
??順序結(jié)構(gòu):程序從Main函數(shù)進(jìn)入,從上到下一行一行的執(zhí)行,不會(huì)落下任何一行。
??選擇結(jié)構(gòu):if、if-else、if-else-if、switch-case
??循環(huán)結(jié)構(gòu):while、do-while、for、foreach
語法
if(判斷條件)
{
代碼塊;
}
判斷條件:一般為關(guān)系表達(dá)式或者bool類型的值亦或是bool類型的變量。
執(zhí)行過程:當(dāng)判斷條件為 True 時(shí)執(zhí)行代碼塊中的內(nèi)容,否則不執(zhí)行并跳出if-else結(jié)構(gòu)。
if
結(jié)構(gòu)的特點(diǎn):先判斷再執(zhí)行,最多執(zhí)行一條代碼。
作用:用于一種情況的判斷
語法
if (判斷條件)
{
代碼塊1;
} else {
代碼塊2;
}
判斷條件:一般為關(guān)系表達(dá)式或者bool類型的值亦或是bool類型的變量。
執(zhí)行過程:上面語句的執(zhí)行過程是當(dāng) if 中的布爾表達(dá)式的結(jié)果為 True 時(shí)執(zhí)行代碼塊1,否則執(zhí)行代碼塊2。代碼塊1或者2執(zhí)行完之后,就跳出if-else結(jié)構(gòu)。
if-else
結(jié)構(gòu)的特點(diǎn):先判斷再執(zhí)行,最少執(zhí)行一條代碼。else
永遠(yuǎn)只跟離它最近的那個(gè)if
配對(duì)。
作用:用于兩種情況的判斷
語法
if (判斷條件1) { 代碼塊1; } else if (判斷條件2){ 代碼塊2; } ... else { 代碼塊n; }
判斷條件:一般為關(guān)系表達(dá)式或者bool
類型的值亦或是bool
類型的變量。
執(zhí)行過程:先判斷條件1 的值是否為 True,如果為 True,執(zhí)行代碼塊 1,整個(gè)語句結(jié)束,否則依次判斷每個(gè)判斷條件的值,如果都不為 True,執(zhí)行else
語句中的語句塊 n。
作用:用于處理多種情況的區(qū)間判斷
需要注意的是,在上面的語法中最后一個(gè) else{} 語句是可以省略的。如果省略了 else{} 語句,那么多分支的 if 語句中如果沒有判斷語句的值為 True 的語句,則不會(huì)執(zhí)行任何語句塊。
語法
switch(變量或者表達(dá)式的值) { case 值1:要執(zhí)行的代碼; break; case 值2:要執(zhí)行的代碼;; break; case 值3:要執(zhí)行的代碼; break; ...... default:要執(zhí)行的代碼; break; }
執(zhí)行過程:程序執(zhí)行到switch處,首先將括號(hào)中變量或者表達(dá)式的值計(jì)算出來,
然后拿著這個(gè)值依次跟每個(gè)case后面所帶的值進(jìn)行匹配,一旦匹配成功,則執(zhí)行該case所帶的代碼,執(zhí)行完成后,遇到break,跳出switch-case結(jié)構(gòu)。
如果跟每個(gè)case所帶的值都不匹配,就看當(dāng)前這個(gè)switch-case結(jié)構(gòu)中是否存在default,如果有default,則執(zhí)行default中的語句,如果沒有default,則該switch-case結(jié)構(gòu)什么都不做。
作用:用來處理多條件的定值判斷。只不過switch-case能夠處理的,if-else也能夠處理
語法
while (循環(huán)條件)
{
循環(huán)體;
}
執(zhí)行過程: 程序運(yùn)行到while處, 首先判斷while所帶的小括號(hào)內(nèi)的循環(huán)條件是否成立,
如果成立的話, 也就是返回一個(gè)true, 則執(zhí)行循環(huán)體, 執(zhí)行完一遍循環(huán)體后, 再次回到
循環(huán)條件進(jìn)行判斷, 如果依然成立, 則繼續(xù)執(zhí)行循環(huán)體, 如果不成立, 則跳出while循環(huán)。
在while循環(huán)當(dāng)中, 一般總會(huì)有那么一行代碼, 能夠改變循環(huán)條件, 使之終有一天不再成立,
如果沒有那么一行代碼能夠改變循環(huán)條件, 也就是循環(huán)條件永遠(yuǎn)都成立, 我們稱之這種循環(huán)叫做死循環(huán)。
最簡單的最常用的死循環(huán)
while (true) {}
特點(diǎn):先判斷,再執(zhí)行,有可能一遍循環(huán)都不執(zhí)行
語法
do
{
循環(huán)體;
}while(循環(huán)條件)
執(zhí)行過程: 程序首先會(huì)執(zhí)行do中的循環(huán)體, 執(zhí)行完成后, 去判斷do-while循環(huán)的循環(huán)條件, 如果成立, 則繼續(xù)執(zhí)行do中的循環(huán)體, 如果不成立, 則跳出do-while循環(huán)。
特點(diǎn): 先循環(huán), 再判斷, 最少執(zhí)行一遍循環(huán)體。
語法
for(表達(dá)式 1; 表達(dá)式 2; 表達(dá)式3)
{
循環(huán)體;
}
表達(dá)式1一般為聲明循環(huán)變量,記錄循環(huán)的次數(shù) (int i=0;)
表達(dá)式2一般為循環(huán)條件 (i<10)
表達(dá)式3一般為改變循環(huán)條件的代碼,使循環(huán)條件終有一天不再成立 (i++)。
執(zhí)行過程:程序首先執(zhí)行表達(dá)式1,聲明了一個(gè)循環(huán)變量用來記錄循環(huán)的次數(shù),
然后執(zhí)行表達(dá)式2 , 判斷循環(huán)條件是否成立,如果表達(dá)式 2 返回的結(jié)果為true,
則執(zhí)行循環(huán)體:當(dāng)執(zhí)行完循環(huán)體后,執(zhí)行表達(dá)式3,然后執(zhí)行表達(dá)式 2 繼續(xù)判斷循環(huán)條件是否成立,
如果成立則繼續(xù)執(zhí)行循環(huán)體,如果不成立,則跳出for循環(huán)。
switch-case
結(jié)構(gòu)break
一般不單獨(dú)的使用,而是跟著if判斷一起使用,表示當(dāng)滿足某些條件的時(shí)候,就不再循環(huán)了。
continue
會(huì)跳過當(dāng)前循環(huán)中的代碼,強(qiáng)制開始下一次循環(huán)。
與變量不同的是,常量在第一次被賦值后值就不能再改變。定義常量需要使用關(guān)鍵字 const 來完成。
語法
const 變量語法 變量名 = 值;
需要注意的是,在定義常量時(shí)必須為其賦值,因?yàn)椴毁x值的話以后就再也不能賦值了。另外,也可以同時(shí)定義多個(gè)常量。
在程序中使用常量也會(huì)帶來很多好處,包括增強(qiáng)了程序的可讀性以及便于程序的修改。例如在一個(gè)計(jì)算率的程序中,為了保證程序中的稅率統(tǒng)一,設(shè)置一個(gè)名為 TAX 的常量來完成,如果需要修改稅率只修改該常量的值即可。
枚舉就是一種變量類型。只是枚舉聲明、賦值、使用的方式跟那些普通的變量類型不一樣。
枚舉的作用:枚舉可以規(guī)范開發(fā)
舉個(gè)例子說明為什么會(huì)有枚舉這個(gè)東西?
比如說你現(xiàn)在和三個(gè)人共同做個(gè)某某大學(xué)管理系統(tǒng)。這是你們四個(gè)人都這些事情,并且都分配了不同的模塊,比如存儲(chǔ)性別,每個(gè)人的定義方法都不相同,你們這個(gè)時(shí)候我們可以共同定義性別的規(guī)范,這是就可以使用枚舉規(guī)范我們的開發(fā)。
語法
//聲明以及使用 [public] enum 枚舉名 { 值1, 值2, 值3, ...... }
public:訪問修飾符。公開的公共的,哪都可以訪問。
enum:關(guān)鍵字,聲明枚舉的關(guān)鍵字
枚舉名:要符合Pascal命名規(guī)范
將枚舉聲明到命名空間的下面,類的外面,表示這個(gè)命名空間下,所有的類都可以使用這個(gè)枚舉。
public enum Season { 春, 夏, 秋, 冬 } Season s = Season.春;
枚舉類型和int類型相互轉(zhuǎn)換
枚舉類型默認(rèn)是跟int類型相互兼容的,所以可以通過強(qiáng)制類型轉(zhuǎn)換的語法互相轉(zhuǎn)換。
當(dāng)轉(zhuǎn)換一個(gè)枚舉中沒有的值的時(shí)候,不會(huì)拋異常,而是直接將數(shù)字顯示出來。
枚舉類型和string類型相互轉(zhuǎn)換
枚舉同樣也可以跟string類型互相轉(zhuǎn)換,如果將枚舉類型轉(zhuǎn)換成string類型, 則直接調(diào)用ToString()
;
如果將字符串轉(zhuǎn)換成枚舉類型則需要下面這樣一行代碼:
(要轉(zhuǎn)換的枚舉類型)Enum.Parse(typeof(要轉(zhuǎn)換的枚舉類型), '要轉(zhuǎn)換的字符串');
如果轉(zhuǎn)換的字符串是數(shù)字,則就算枚舉中沒有,也不會(huì)拋異常。
如果轉(zhuǎn)換的字符串是文本,如果枚舉中沒有,則會(huì)拋異常。
結(jié)構(gòu)作用:可以幫助我們一次性聲明多個(gè)不同類型的變量。
[public] struct 結(jié)構(gòu)名
{
成員; //字段
}
變量在程序運(yùn)行期間只能存儲(chǔ)一個(gè)值,而字段可以存儲(chǔ)多個(gè)值。
數(shù)組作用:可以幫助我們一次性存儲(chǔ)多個(gè)相同類型的變量。
通過下標(biāo)或者索引去訪問和賦值數(shù)組中的元素。
語法
數(shù)組類型[] 數(shù)組名 = new 數(shù)組類型[數(shù)組長度];
數(shù)組的長度一旦固定了,就不能夠再改變了。
通過下方兩個(gè)操作可以實(shí)現(xiàn)數(shù)組的升序和降序。
Array.Sort(數(shù)組); //升序
Array.Reverse(數(shù)組); //反轉(zhuǎn)數(shù)組
方法就是將一堆代碼進(jìn)行重用的一種機(jī)制
語法
[public] static 返回值類型 方法名([參數(shù)列表])
{
方法體;
}
public:訪問修飾符,公開的, 公共的,哪都可以訪問
static:靜態(tài)的
返回值類型:如果不需要寫返回值,寫void
方法名:Pascal 每一個(gè)單詞的首字母都大寫,其余字母小寫
參數(shù)列表:完成這個(gè)方法所必須要提供給這個(gè)方法的條件。如果沒有參數(shù),小括號(hào)也不能省略。
方法寫好后,如果想要被執(zhí)行,必須要在Main()函數(shù)中調(diào)用。
方法的調(diào)用語法
類名.方法名([參數(shù)]);
在某些情況下,類名是可以省略的,如果你寫的方法跟Main()函數(shù)同在一個(gè)類中,這個(gè)時(shí)候,類名可以省略。
我們?cè)?code>Main()函數(shù)中,調(diào)用Test()
函數(shù),我們管Main()
函數(shù)稱之為調(diào)用者,管Test()函數(shù)
稱之為被調(diào)用者。
如果被調(diào)用者想要調(diào)用者的值:
1.傳遞參數(shù)
2.使用靜態(tài)字段來模擬全局變量
(CSharp沒有全局變量,但是可以用靜態(tài)字段模擬全局變量,靜態(tài)變量的作用域是聲明的類當(dāng)中)
如果調(diào)用者想要被調(diào)用者的值:
1.return 返回值;
方法需要注意的地方
1.不管是實(shí)參還是形參,都是在內(nèi)存中開辟空間。
2.方法的功能一定要單一。錯(cuò)誤示范:GetMax(int n1, int n2) //判斷閏年
3.方法中最忌諱的就是出現(xiàn)提示用戶輸入的字眼,所以你需要盡可能地不使用Console.WriteLine()
方法來達(dá)到目的。
如果你在一個(gè)方法中,返回多個(gè)相同類型的值的時(shí)候,可以考慮返回一個(gè)數(shù)組。
但是,如果返回多個(gè)不同類型的值的時(shí)候,返回?cái)?shù)組就不行了,那么這個(gè)時(shí)候,我們可以考慮使用out參數(shù)。
out參數(shù)就側(cè)重于在一個(gè)方法中返回多個(gè)不同類型的值。
out參數(shù)要求在方法的內(nèi)部必須為其賦值。
out意思就是返回多余的值。
能夠?qū)⒁粋€(gè)變量帶入一個(gè)方法中進(jìn)行改變,改變完成后,再講改變后的值帶出方法。
ref參數(shù)要求在方法外必須為其賦值,而方法內(nèi)可以不賦值。
將實(shí)參列表中跟可變參數(shù)數(shù)組類型一致的元素都當(dāng)作數(shù)組的元素去處理。
params 參數(shù)必須是形參表中最后一個(gè)參數(shù)。一個(gè)形參列表中只能有一個(gè)params參數(shù)。
方法的重載指的就是方法的名稱相同,但是參數(shù)不同。
參數(shù)不同,分為兩種情況
1.如果參數(shù)的個(gè)數(shù)相同,那么參數(shù)的類型就不能相同。
2.如果參數(shù)的類型相同,那么參數(shù)的個(gè)數(shù)就不能相同。
注:方法的重載跟返回值沒有關(guān)系
方法自己調(diào)用自己
異常是指 語法上沒有任何錯(cuò)誤,在程序運(yùn)行的過程當(dāng)中,由于某些原因出現(xiàn)了問題,使程序不能再正常的運(yùn)行。
我們?cè)诔绦蛑薪?jīng)常會(huì)出現(xiàn)各種各樣的異常,你如果想要你的程序變得堅(jiān)強(qiáng)一些。
在你的代碼中應(yīng)該經(jīng)常性的使用try-catch來進(jìn)行異常捕獲。
哪行代碼有可能出現(xiàn)異常,你就try它一腳。
語法
try { 可能會(huì)出現(xiàn)異常的代碼塊; } //try和catch之間不能有其它的代碼 catch { 出現(xiàn)異常后要執(zhí)行的代碼塊; }
執(zhí)行過程:如果try中的代碼沒有出現(xiàn)異常,那么catch中的代碼不會(huì)執(zhí)行。
如果try中的代碼出現(xiàn)了異常,那怕這行出現(xiàn)異常的代碼后面還有一百行都不會(huì)執(zhí)行了。
而是直接跳到catch中執(zhí)行代碼。
Random r = new Random();
int rNumber = r.Next(1, 11); //左閉右開
|