C#零基礎開發中最重要的概念總結
初步
學習C#自然推薦使用宇宙最強IDE Visual Studio,初學下載社區版,安裝過程中,將除瞭移動開發之外的帶有C#和.Net字樣的選項都勾上。
安裝完成後,打開VS->創建新項目->C#控制臺應用->下一步->項目名稱、位置隨便寫->下一步->框架選.Net6.0->點擊創建,然後就會看到我們的第一個CSharp程序。
// See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!");
代碼的可讀性是非常強的,Console表示控制臺,WriteLine就是寫下一行,合起來就是在命令行中寫一行話,這行話就是Hello World!。
C#中,通過//進行單行註釋/**/進行多行註釋。每行代碼要以分號;結尾!!
按下F5就可以執行這段程序瞭,彈出命令行,內容為
Hello, World!
E:\Documents\00\1116\CSharp\MyFirstCS\bin\Debug\net6.0\MyFirstCS.exe (進程 17312)已退出,代碼為 0。
要在調試停止時自動關閉控制臺,請啟用“工具”->“選項”->“調試”->“調試停止時自動關閉控制臺”。
按任意鍵關閉此窗口. . .
這裡額外說一段,對於.Net5.0以前的版本,需要在這個語句外面套一層Main函數,Main函數外面套一層Class,Class外面再套一層namespace。
數學計算和函數
常用的數學計算可通過運算符來實現,比如加減乘除,就是+-*\,此外還有%表示求餘,例如
Console.WriteLine(5%3);
命令行中出現2。
除瞭Lisp風格的語言之外,絕大多數編程語言對四則混合運算的支持都有良好的可讀性,比如2+3*5這種式子,其實是無需詳述的。
但四則混合運算其實並不能完全滿足我們的需求,最起碼很多情況下需要用到平方,為瞭實現這個功能,就需要自定義函數
double square(double x) { return x * x; } Console.WriteLine(square(3.5));
F5執行之後,命令行輸出瞭12.25。
接下來,將上面的表達式對應到y=f(x)=x2這樣的函數表達式中
d1 f(d2 x) { return y; }
也就是說,類比數學中的概念,square為函數名,x為自變量,y為因變量。而在編程領域,一般把x叫做輸入參數,y則叫做返回值。
而d1和d2所對應的double,則為輸入變量和輸出變量的數據類型。
變量和數據類型
從數學的角度,可以非常簡單粗暴地理解數據類型,即數據類型有兩類,一類是小數,一類是整數。對於希望速成的初學者來說,整數用int表示,小數用double表示,當然編程中一般把小數叫做浮點數。
這時就有一個尖銳的問題,"Hello World"又是個啥?
好吧你贏瞭,那就再加一種數據類型,就是字符串。而且字符串和數值還有區別,小數和整數盡管類型不同,但總可以互相計算的,比如小數和整數相加,最後得到的是個整數;但小數和字符串相加,最後應該沒法得到值。
也就是說,四則混合運算對字符串不適用。
你可能不信,於是寫出瞭這行代碼
Console.WriteLine("Hello" + "World");
好吧你又贏瞭,+隻在高中數學中表示加法,在編程語言中隻是一個代碼,既可以將其定義為加法,也可以將其定義為字符串拼接。
有瞭數據類型,就可以定義變量
double square(double x){ return x * x; } double a = 1.5; int b = 2; Console.WriteLine(square(a)+b);
最後命令行輸出4.25,square(a)是對浮點數做平方,然後輸出瞭浮點數,而b是整型,根據輸出結果可以直到,浮點型和整型相加,最後的結果仍然是浮點型。
佈爾類型和判斷
數值計算和解析計算的區別在於,後者是無限的,而前者是有限的。網上經常說π又算到瞭多少多少位,就講出瞭這個區別。π 顯然是無窮多位的,但計算機隻能表現出有限的位數,這種位數的限制,使得整型和浮點型內部產生瞭分 裂。
眾所周知,計算機操作的是二進制的邏輯電路,用32位二進制,可以表示的最大整數就是232=4294967296,要是還想考慮一下0,那就再要減一,要是再考慮負數,就要再減半。
C#中提供瞭多種位數的整型和浮點型,其中整型又包括有符號和無符號兩種,所謂有符號,就是有正有負;無符號就是0和正整數。比如double就是64位浮點型;int是32位有符號整型;uint是32位無符號整型。
當數據位數降到1位時,一位的二進制就隻剩下兩個值0和1,仿佛是一個開關,於是量變引起瞭質變,佈爾類型誕生瞭。
這個時候,0 00和1 11被賦予瞭非常重要的現實意義,用於表示無或有,以及錯和對,即false和true。
有瞭對錯,就可以判斷,在幾乎所有編程語言中,都用if表示判斷
void trueOrFalse(bool c){ if(c){ Console.WriteLine("你是對的"); } else{ Console.WriteLine("我是錯的"); } } trueOrFalse(true);
運行之後,輸出你是對的。
拋開if不談,這個函數也和之前定義的不太一樣,這個函數沒有返回值,所以其輸出的數據類型為void。
大多數人接觸if時的學習案例往往是這個
void bigOrlittle(int a, int b) { if (a > b) { Console.WriteLine($"{a}>{b}"); } else if (a < b) { Console.WriteLine($"{a}<{b}"); } else { Console.WriteLine($"{a}={b}"); } } bigOrlittle(3, 5); //輸出為 3<5
這個案例給出瞭完整的判斷語句,if…else if…else,中間的else if可以為無窮多個。據說有一款遊戲中,堆瞭一個19億次判斷的屎山,被坊間傳為笑談。
其中,<是也是一種運算符,其輸入為兩個數值,輸出為佈爾型變量。如果左邊的小於右邊的,就輸出true,否則就輸出false。這類運算符被統稱為條件運算符,包括全等判斷==,不等判斷!=以及>,<,>=,<=。
數組和for循環
前文提到,除瞭數值之外,字符串是另外一種數據類型,這兩種類型之間並不能直接運算。而且前文又提到,數值類型和二進制的位數是息息相關的,32位整型能表示的最大數值不超過232。
但字符串似乎並沒有這種限制,隻要計算機內存扛得住,似乎可以在雙引號中寫入任意長度的字符串。這種奇怪的特性表明,字符串並不是一種單純的數據類型,而是由字符組成的串。
所謂字符,就是諸如'a','b','c'這樣單個的字母或者文字,它們和數值類型都要受到二進制位數的限制。C#中的char類型由兩個字節組成,也就是16位二進制,最多可以涵蓋65536個單字。而字符串,就是由這一個個字符拼接而成。
推此及彼,數值類型也應該有類似的串的結構,此即數組,其聲明方式如下
int[] arr = new int[5]; Console.WriteLine(arr); // System.Int32[]
int[]表示整型數組,new表示創建一個數組的實例,後面int[5]表似乎這個數組的長度為5。最後調用Console.WriteLine來打印arr,結果並沒有輸出數組的內容。
先不考慮數組是否支持用WriteLine,arr在創建出來之後,其實並沒有為其賦值,所以非要輸出,輸出為空也是符合邏輯的。
數組賦值的方法也很便捷,arr[0]=1表示將arr中的第0個值賦為1。千萬要註意,C#中,索引序號是從0開始的。
接下來又出現瞭一個嚴重的問題,如果要創建一個有1000個元素的數組,那給數組初始化不得寫1000行?要是按行數算工資的話老板不得虧死?
所以接下來就引入另一個概念,for循環,如下
int[] arr = new int[5]; for (int i = 0; i < 5; i = i+1) { arr[i] = i * i; }
在(int i=0; i<5; i=i+1)中,int i聲明瞭一個變量,i=0表示這個變量從0開始,i=i+1表示每次循環,i都變成i+1,i<5表示隻有在i<5的情況下才執行循環。
由於i=i+1這種寫法過於繁瑣,C#提供瞭自增運算符i++,再意義上與i=i+1等價。
花括號中是循環體,對數組arr逐個進行賦值。唯一比較可惜的是,Console.WriteLine並不能直接把數組中的內容打印出來,為瞭打印數組中的內容,還要再寫個循環
for (int i = 0; i < 5; i++) { Console.WriteLine(arr[i]) }
當然,對於數組操作,這裡其實推薦這種寫法
foreach (var e in arr) { Console.WriteLine(e); }
foreach表示遍歷數組中的所有元素,再(var e in arr)中,var表示自動判定數組內元素的數據類型,e則為遍歷到的arr中的元素創建一個臨時的變量。這樣就把arr中所有的元素打印出來瞭。
0
1
4
9
16
當然,圈子兜瞭這麼遠,主要目的並不是初始化數組,而是為瞭講述for循環,因為數組初始化有更加便捷的方式
int[] arr = {0,1,4,9,16}
while循環與跳出
其實有瞭for循環就已經可以解決幾乎所有循環問題瞭,但從邏輯上來說,for循環並不存粹,裡面加入瞭大量私貨。畢竟對循環而言,其實隻需要一個循環條件就可以瞭,符合這個條件就循環,不符合就跳出,while就是幹這個的,其使用方法與if十分相似
double a = 1.5 while(a*a<100){ a++; Console.WriteLine(a); }
但while中沒有else,也就是說,隻能判斷一個條件,如果有多個跳出條件,可以用break。
while(a*a<100){ a++; if(a>5){ //當a>5時,跳出循環 break; } Console.WriteLine(a); }
另一種情況是,如果並不想把所有a都打印出來,則可以通過continue來跳過某次循環,下面打印出平方小於100的所有奇數
a = 0 while(a*a<100){ a++; if(a%2==0){ //當a>5時,跳出循環 continue; } Console.WriteLine(a); }
到此這篇關於C#零基礎開發中最重要的概念總結的文章就介紹到這瞭,更多相關C#開發內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!