C#筆記
C#發展史
- 1998年,C#發布第一個版本。
- 2002年,visual studio開發環境推出
C#的特點
1.語法簡潔,不允許直接操作內存,去掉了指針操作
2.徹底面向對象設計。
3.與Web緊密結合。
4.強大的安全機制,語法錯誤提示,引入垃圾回收器機制。
5.兼容性。
6.完善的錯誤,異常處理機制。
.NET(平臺)
面向網絡支持各種用戶終端的開發環境
- 公共語言運行時(CLR): 中間語言代碼,負責將不同的編程語言的編譯結果統一。
- 類庫:系統封裝好的工具包,可以直接拿來使用。
.NET發展
- 2000 比爾蓋茨提出構想
- 2002 微軟發布了.NET Framework1.0
- 2003 微軟發布了.NET Framework1.1
- 2005 微軟發布了.NET Framework2.0
- 2006 微軟發布了.NET Framework3.0
- 2010 微軟發布了.NET Framework4.0
- 2020 .Net5.0發布
Visual Studio項目管理
1.解決方案:包含多個不同類型的項目,是一個項目集合,大的文件夾。
.Net中常見的文件類型
? .sln:解決方案文件
? .csproj:項目文件
? .cs:C#源碼文件
? .resx:資源文件
? .aspx:網頁文件
? .asmx:XML Web文件
? .config:配置文件
? .suo:解決方案用戶選項
命名空間(namespace):命名控件在C#中起到組成程序的作用,也可以作為外部程序調用的憑證。
類:class為類的關鍵字,每個對象都屬于一個類,類是對象的模板。
關鍵字:系統提前賦予特定意義的一些單詞。
標識符
開發過程中,需要自定義命名的,如變量名,常量名,對象名,方法名,函數名等都屬于標識符。
命名規則:由字母、下劃線、數字組成,且數字不能開頭,不能使用關鍵字。
Main方法(程序入口)
C#程序中的Main方法必須聲明為static,并且區分大小寫
static void Main(string[] args){//程序代碼} /*static:靜態修飾符 void:表示無返回值 string[] args:表示參數為數組*/
注釋語句
功能:注釋起解釋代碼的作用,不會參與代碼的編譯工作
- 行注釋:以“//”開頭,將一整行代碼注釋掉
- 塊注釋:以“/* ”開頭,中間包含注釋內容,以“ */”結尾
輸入方法和輸出方法
輸入方法:Console.Readline() ------從鍵盤獲取一行字符串
? Console.Read() -------從鍵盤獲取一個字符
輸出方法:Console.WriteLine() -----將數據輸出至屏幕并且加上一個換行符
? Console.Write() -----將數據輸出至屏幕
注意:
1.同一行代碼可以書寫多條語句。
int a; int b; int c;
2.將一條語句拆分成多行書寫。
Console.WriteLine ("你好");
數據類型
值類型
簡單類型
整數類型
類型標識符 說明 占用位數 取值范圍 sbyte 帶符號字節型 8 -27~27-1 byte 無符號字節型 8 0~2^8-1 short 帶符號的短整型 16 -215~215-1 ushort 無符號的短整型 16 0~2^16-1 int 帶符號的整型 32 -231~231-1 uint 無符號整型 32 0~2^32-1 long 帶符號的長整型 64 -263~263-1 ulong 無符號的長整型 64 0~2^64-1 實數類型
類型標識符 說明 占用位數 精度 float 單精度浮點數 32 6~7位 double 雙精度浮點數(取值范圍最大) 64 15~16位 decimal 固定精度浮點數(精度最高) 128 28~29位 注意:
? 1.包含小數點的數值會被默認位double類型。
? 2.在數值后邊加F或f可以強制指定為float類型。
? 3.在數值后邊加M或m可以強制指定為decimal類型。
Double double1 = 3.14; float float1 = 3.14f; decimal decimal1 = 3.1415926m;
字符類型
采用Unicode編碼格式,每個字符占用兩個字節。
定義字符類型使用char關鍵字,值使用單引號(‘’)括起來。
char chr1 = 'a'; char chr2 = '你';
注意:
? 1.如果使用雙引號,即使包含一個字符也會認定為字符串類型,字符類型是基本數據類型,字符串類型為用引用類型。
布爾類型
Boolean flag1 = true; Boolean flag2 = false;
注意:
布爾類型不能直接轉換為int類型。
復雜類型
結構類型
將分散簡單變量整合為一體,體現數據之間的內在聯系。
//定義語法 struct 結構名稱 {數據類型 字段名1;數據類型 字段名2;...}//定義一個具有姓名和年齡的結構類型Student struct Student {public string name;public int age;public char sex; }
枚舉類型
指程序中某個變量具有一組確定的值,通過枚舉可以將其值一一列出來。
//定義枚舉 enum 枚舉名{枚舉成員1,枚舉成員2,... }enum season {spring,summer,autumn,winter }
引用類型
object類型
object類型是所有類型(值類型和引用類型)的基類,C#中所有的類型都是直接或者間接繼承object,一個 object類型的變量可以賦任何類型的值。
int x = 100; object obj; obj=x; Object obj2 = "你好"; Console.WriteLine(obj); Console.WriteLine(obj2);
string類型
字符串對象,表示一個Unicode字符序列。String和string都能定義字符串變量
String str = "Hello World"; string str2 = "你好"; Console.WriteLine("{0},{1}",str,str2);
值類型與引用類型的區別
值類型:棧
引用類型:堆
類型轉換
隱式轉換
不需要加以聲明就可以進行的轉換,原類型取值范圍包含在目標類型中,就可以實現隱式轉換。
小--------->大
int a = 12345; long b = a;
顯示轉換(強制轉換)
//(類型標識符)表達式 float a = 123.45f; Console.WriteLine((int)a); //實數類型轉換為整數類型通常輝出現精度丟失問題
使用方法進行數據類型轉換
1.Parse方法:可以將字符串轉換為數值型。
//語法:數值類型名稱.Parse(字符串表達式) int a = int.Parse("123456"); Console.WriteLine(a);int pwd = int.Parse(Console.ReadLine()); Console.WriteLine(pwd);
2.Convert類的方法:將一種基本數據類型轉換為另一種基本數據類型
//語法:Convert.轉換方法(值) int a; a = Convert.ToInt32("123"); Console.WriteLine(a);int pwd; pwd = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(pwd);
裝箱與拆箱
實現值類型與引用類型的相互轉換。
裝箱轉換(將一個值類型的數據轉換為對象類型的數據)
int i = 10; object obj = i;
拆箱轉換(將一個引用類型的數據轉換為值類型數據)
int i = 10; object obj = i; int j = (int)obj;
變量與常量
常量
概念:在程序運行過程中,其值不會改變的量。
分類:
直接常量(一個固定值)
1.整型常量:16,28L 2.浮點常量:3.14,4.25f,8.997m 3.字符常量:'a','0' 4.字符串常量:"abc","HelloWorld" 5.布爾常量:true,false
符號常量
//定義語法:常量名全大寫 //const 數據類型 常量名 = 常量值 const float PI = 3.14;/*注意: 1.const是定義常量的關鍵字 2.常量名推薦全部大寫 3.常量一旦賦值,不可修改 4.常量的賦值只能適用常量和常數,不能使用變量 */
變量
概念:在程序運行過程中其值可以不斷改變的量。
變量名:
- 只能使用數字、字母、下劃線組成,且數字不能開頭
- 不能使用關鍵字
- 嚴格區分大小寫
- 如果使用關鍵字作為變量名,開頭需加@
變量的定義
//語法: //數據類型 變量名[ = 值]; //可以再定義變量時直接賦值,也可以后期賦值。 int a = 13; int b; b = 3+5;
變量的作用域(定義變量的適用范圍)
- 成員變量:在類體中定義的變量稱為成員變量,在整個類體中都能用。
- 局部變量:在類的方法中定義的變量,只能在方法內部使用。
運算符與表達式
算數運算符
符號 意義 示例 結果 + 加法運算 12+34 46 - 減法運算 88-23 65 * 乘法運算 3*2 6 / 除法運算
(運算符左右都為整型,做整除運算)10/3.0 3.33333 % 取余 10%3 1 自增與自減運算符
自增運算(++)使操作數的值加1
自減運算(–)使操作數的值減1
int i = 1; i++; Console.Writeline(i); //i=2 i-- Console.Writeline(i); //i=1
位置規則:
前置形式:先進行自增或自減再進行運算
后置形式:先進行運算再進行自增或自減
int a = 5, b, c;b = a++;Console.WriteLine(a); //a=6 b=5c = ++a; //c=7Console.WriteLine(a); //a=7Console.WriteLine(b); //b=5Console.WriteLine(c); //c=7
字符串運算符
+:拼接字符串,合并成新字符串。
String a = "123";int b = 465;Console.WriteLine(a + b); //123456
賦值運算符
/*變量名 = 值/表達式 =:賦值運算符,將等號右邊的值賦值給等號左邊的變量或者常量*/string a; a = "Hello World"; int i; i = (int)12.3;**賦值復合運算符**| 符號 | 意義 | 示例 | | ------ | ------------ | ----------------------------- | | **+=** | **加賦值** | **a+=b 等同于 a=a+b** | | **-=** | **減賦值** | **a-=b 等同于 a=a-b** | | ***=** | **乘賦值** | **a'**='b 等同于 a=a*'*'b** | | **/=** | **除賦值** | **a/=b 等同于 a=a/b** | | **%=** | **取模賦值** | **a%=b 等同于 a=a%b** | | <<= | 左移賦值 | a<<=b 等同于 a=a<<b | | >>= | 右移賦值 | a>>=b 等同于 a=a>>b | | &= | 與賦值 | a&=b 等同于 a=a&b | | ^= | 異或賦值 | a^=b 等同于 a=a^b | | \|= | 或賦值 | a\|=b 等同于 a=a\|b |
關系運算符
概念:比較兩個運算數的關系,結果為true和false
符號 意義 < 小于 <= 小于等于 > 大于 >= 大于等于 == 等于 != 不等于 邏輯運算符
符號 意義 示例 ! 邏輯非(取反) !(2<3)------>false && 邏輯與(同時為真結果為真,否則為假) 3>2 && 5<7 ------->true || 邏輯或(有一個為真最終結果即為真) 8<9 || 9=10 ------->true //閏年的判斷:閏年年份可以被4整除并且不能被100整除,或者能被400整除 year%4==0 //能被4整除 year%100!=0 //不能被100整除 year%400==0 //能被400整除 year%4==0 && year%100!=0 || year%400==0
條件運算符|三目運算符|三元表達式|行狀判斷語句
格式:表達式1?表達式2:表達式3
邏輯:表達式結果為真,執行表達式2,為假執行表達式3.
int a,b,c; a = 16; b = 19; a>b?c=a?c=b;
運算符優先級
運算符類別 運算符 優先級 單目運算 ++、–、! 1 算數運算符 *、/、% 2 +、- 3 關系運算符 >、>=、<、<= 4 ==、!= 5 邏輯運算符 && 6 || 7 條件運算符 ?: 8 賦值運算 = 9
控制結構
順序結構
輸入語句:
Console.Read(); //返回用戶從控制臺上輸入數據的首字符的ASCII碼 Console.ReadLine(); //將用戶輸入的一行信息用string類型的字符串返回
輸出語句:
Console.WriteLine(); //輸出后自動換行 Console.Write(); //輸出后不換行
分支結構
單分支
/*語法:if(判斷表達式){代碼塊 }*///輸入一個年齡,判斷是否成年Console.Write("請輸入年齡:");int age = int.Parse(Console.ReadLine());if (age >= 18) {Console.WriteLine("成年");}Console.ReadKey();
雙分支
/*語法: if(判斷表達式){代碼塊1 }else{代碼塊2 } *///輸入一個年齡,判斷是否成年 Console.Write("請輸入年齡:"); int age = int.Parse(Console.ReadLine()); if (age >= 18) {Console.WriteLine("成年"); } else {Console.WriteLine("未成年"); }Console.ReadKey();
多分支1
/* if(判斷表達式1){代碼塊1 }else if(判斷表達式2){代碼塊2 }...else{代碼塊N } */ //輸入一個年齡,如果年齡在0~18歲為兒童,19~60成年人,60以上為老人Console.Write("請輸入年齡:");int age = int.Parse(Console.ReadLine());if (age >= 0 && age <= 18){Console.WriteLine("兒童");}else if (age > 18 && age <= 60){Console.WriteLine("成人");}else if (age > 60){Console.WriteLine("老人");}else {Console.WriteLine("輸入有誤");}Console.ReadKey();
多分支結構2
/* 語法:switch(表達式){case 常量表達式1:語句1;break;case 常量表達式2:語句2;break;...default:語句n;break; } *///輸入學生成績,判斷改成績處于哪個階段,100以上為滿分,90以上為優,80分以上為良好,60以上為及格,否則為不及格。Console.Write("請輸入成績:");int score = int.Parse(Console.ReadLine());switch (score/10) {case 10:Console.WriteLine("滿分");break;case 9:Console.WriteLine("優秀");break;case 8:Console.WriteLine("良好");break;case 7: //case 7中沒有break語句,程序不會跳出 結構,直接轉入下一個分支case 6:Console.WriteLine("及格"); break;default:Console.WriteLine("不及格");break;}Console.ReadKey(); }
總結:
- if判斷后的表達式結果為布爾類型,switch判斷后的表達式為整型。
- 分支結構只會執行一個分支
- switch…case語句中不加break,程序不會跳出判斷結構。、
- 多分支結構中注意判斷條件的順序。
循環結構
for循環
/*語法: for(循環變量初始化;判斷語句;循環變量的更新){循環體 } 執行順序: 1.初始化循環變量 2.判斷循環條件是否滿足 3.滿足 不滿足 4.執行循環體 跳出循環 5.更新循環變量 6.判斷循環條件是否滿足 .... */ for(int i=0;i<=10;i++){Console.WriteLine(i); }/*注意: 1.for循環中三個表達式都可以省略,分號不可以省略 2.如果在循環結構中省略變量初始化,那么需要將變量初始化放在循環結構前邊,否則報錯 3.如果在循環結構中省略判斷條件,那么會陷入死循環,無法自動中止。 4.如果在循環結構中省略變量更新,也會陷入死循環。 5.如果循環結構中的所有表達式都省略,也會陷入死循環。 */ //打印1~100之間所有的奇數//1~100所有數字找到for (int i = 1; i <= 100; i++){//判斷當前的數字是否為奇數?if (i % 2 == 0){Console.WriteLine(i);}}//計算10的階乘 1*2*3*4*5*6*7*8*9*10 //計算1~100之間所有的奇數之和? 1+3+5+7+9...
while循環
/*語法: while(循環條件){循環體 } 執行邏輯:循環條件為真執行循環體,循環條件為假不執行循環體(先判斷后執行) */ //使用while實現登錄系統,重新輸入賬戶密碼操作//登陸系統string user="root&