c#入門到高級(全)

一、
1.
.cs 類
2.
引用命名空間
3.
Main函數是程序的主入口,程序寫在Main函數下才可被執(zhí)行
4.
.sln : 解決方案文件
.csproj :項目文件
二、
1.
Console,WriteLine("要打印的內容");
Console,ReadKey();//暫停當前程序,等待用戶按下任意鍵繼續(xù)
三、
1.Ctrl+K+D 快速對齊
2.Shift+Home Shift+End
3.Ctrl+K+C注釋選中的代碼
4.Ctrl+K+U取消注釋選中的代碼
5.折疊冗余代碼: #region #endregion
四、
1.
儲存整數100
數據類型:整數
在內存中開辟的空間應該是整數類型 int
2.
存儲變量的語法:
變量類型 變量名;
變量名=值;
3."="在這里并不表示等于,而是賦值,表示把等號右邊的值賦值給等號
左邊的變量
4.數據類型
1)、整數類型:int 只能存儲整數,不能存儲小數。
2)、小數類型:double 既能存儲整數,也能存儲橡樹,小數點后面的位
數 15~16位。
3)、金錢類型:decimal 用來存儲金錢,值后面需要加上一個m。
4)、字符串類型:string 用來存儲多個文本,也可以存儲空,字符串類
型需要被雙引號引起來
5)、字符類型:char 用來存儲單個字符,最多最少只能有一個字符,不
能儲存空,字符類型的值需要用單引號引起來
三、
1.給變量命名的時候要滿足兩個規(guī)范:
1)、Camel 駱駝命名規(guī)范,要求變量名首單詞的首字母要小寫,其余每
個單詞的首字母要大寫,多用于給變量或字段命名。
highSchoolStudent
2)、Pascal 命名規(guī)范:要求每個單詞的首字母都要大寫,其余字母小寫,
多用于給類或者方法命名。
HighSchoolStudent
2.賦值運算符
=; 表示賦值的意思,表示把等號右邊的值賦值給等號左邊的變量。
由等號連接的表達式稱之為賦值表達式。
注意:每個表達式我們都可以求解除一個定值,對于賦值表達式而言,等
號左邊的變量的值,就是整個賦值表達式的值。
int number=10;
3.+號的作用
1)、連接:當+號兩邊有一邊是字符串的時候,+號就起到連接的作用
2)、相加:當+兩邊是數字的時候,+號就起到相加的作用
4.占位符
使用方法:先挖個坑,再填個坑。
使用占位符需要注意的地方:
1、你挖了幾個坑,就填幾個坑,如果你多填了,沒效果
???????????????如果你少填了,報異常
2、輸出順序:按照挖坑的順序輸出
3.異常
異常是指:語法上沒有任何錯誤,只不過在程序運行期間,由于某些原因
出現了問題,使程序不能再正常運行,也被稱作Bug
4.轉義符
轉義符值得就是一個'\'+一個特殊的字符,組成了一個具有特殊含義的字
符。
\n 表示換行
\" 表示一個英文半角的雙引號
\t 表示一個TAB鍵的空格
\b 表示一個退格鍵,放到字符串的兩邊沒有效果
\\ 表示一個\
@符號
1.取消\在字符串中的轉義作用
2.將字符串按照編輯的原格式輸出
5.算數運算符
+
-
*
/
%
6.類型轉換
隱式類型轉換:
我們要求等號兩邊參與運算的操作書的類型必須一致,如果不一致,滿足
下列條件會發(fā)生自動類型轉換,或者稱之為隱式類型轉換。
兩種類型兼容
列如:int 和 double 兼容(都是數字類型)
目標類型大于原類型
列如:double > int (小的轉大的)
顯式類型轉換:
1.兩種類型相兼容 int-->double
2.大的轉成小的 double-->int
語法:
(待轉換的類型)要轉換的值;
總結:
自動類型轉換:int-->double
顯示類型轉換:double-->int
五、
1.如果兩個變量的類型相兼容,可以使用自動類型轉換或者強制類型轉換,
但是,如果兩個類型的變量不兼容,比如 string 和 int,這時候我們可
以使用一個叫做Convert的轉換工廠進行轉換。
注意:使用Convert進行轉換,也要滿足一個條件:
面上要過的去,比如:
string a = "123"// 可以轉成 int 或 double
string b = "123abc"//不可以轉成 int 或 double
2.算數運算符
++:分為前++和后++,不管是前++還是后++,最終的結果都是給這
個變量加一。
去別表現在表達式當中,如果是前++,則先給這個變量自身加一,然后
帶著這個加一后的值去參與運算。
如果是后++,則先拿原值參與運算,運算完成后,再將這個變量自身加
一。
--:同上。
3.
對于像++或--這樣只需要一個操作數就能完成的運算,我們稱之為一元
運算符。
+ - * / %對于這些需要兩個或以上才能完成運算的操作符,我們稱之為
二元運算符。
一元運算符的優(yōu)先級要高于二元運算符。
如果在一個表達式當中,既有一元運算符,又有二元運算符,我們首先計
算一元運算符。
4.關系運算符
>
<
>=
<=
==
!=
關系運算符是用來描述兩個事物之間的關系
由關系運算符連接的表達式稱之為關系表達式。
5.bool類型
在c#中我們用bool類型來描述對或者錯。
bool類型的值只有兩個 一個true 一個false
6.邏輯運算符
&&邏輯與
||邏輯或
!邏輯非
邏輯運算符兩邊放的一般都是關系表達式或者bool類型的值
5>3&&true
3>5||false
!表達式
邏輯表達式的結果同樣也是bool類型
7.復合賦值運算符
+=
-=
*=
/=
%=
8.順序結構:程序從Main函數進入,從上到下一行一行的執(zhí)行,不會落下
任何一行。
分支結構:if if-else
選擇結構:if else-if switch-case
循環(huán)結構:while do-while for foreach
9.if語句:
語法:
if(判斷條件)
{
要執(zhí)行的代碼;
}
判斷條件:一般為關系表達式或者bool類型的值。
執(zhí)行過程:程序運行到if處,首先判斷if所帶的小括號中的判斷條件,
如果條件成立,也就是返回true,則執(zhí)行if收帶的大括號中的代碼,
如果判斷條件不成立,也就是返回一個false,則跳過if結構,繼續(xù)向下
執(zhí)行。
if結構的特點,先判斷,再執(zhí)行,有可能一行代碼都不執(zhí)行
用于一種情況的判斷
如果你想表示的含義是當b的值為true的時候去執(zhí)行if中的代碼,
那么語法上==true可以省略
但是,如果你想表達的是當b==false的時候去執(zhí)行if中的代碼,
語法上==false不能省略
10.if-else
語法:
if(判斷條件)
{
執(zhí)行的代碼;
}
else
{
執(zhí)行的代碼;
}
執(zhí)行過程:程序執(zhí)行到if處,首先判斷if所帶的小括號中的判斷條件是否
成立,
如果成立,也就是返回一個true,則執(zhí)行if所帶的大括號中的代碼,
執(zhí)行完成后,跳出if結構。
如果if所帶的小括號中的判斷條件不成立,也就是返回一個false,
則跳過if語句,執(zhí)行else所帶的大括號中的語句,執(zhí)行完成后,
跳出if-else結構。
if-else結構的特點:先判斷,再執(zhí)行,最少都要執(zhí)行一條代碼。
用于兩種情況的判斷
10.if else-if
作用:用來處理多條件的區(qū)間性的判斷。
語法:
if(判斷條件)
{
要執(zhí)行的代碼;
}
else if(判斷條件)
{
要執(zhí)行的代碼;
}
else if(判斷條件)
{
要執(zhí)行的代碼;
}
else if(判斷條件)
{
要執(zhí)行的代碼;
}
......
else
{
要執(zhí)行的代碼;
}
執(zhí)行過程:程序首先判斷第一個if所帶的小括號中的判斷條件,如果條件
成立,也就是返回一個true,
則執(zhí)行該if所帶的大括號中的代碼,執(zhí)行完成后,立即跳出if else-if
結構。
如果第一個if所帶的判斷條件不成立,也就是返回一個false,則繼續(xù)向
下進行判斷,依次的判斷每一個if的判斷條件,如果成立,就執(zhí)行該if所
帶的大括號中的代碼,如果不成立,則繼續(xù)行俠判斷,
如果每個if所帶的判斷條件都不成立,就看當前這個if else-if結構中是
否存在else。
如果有else的話,則執(zhí)行else中所帶的代碼,如果沒有else,則整個
if else-if結構什么都不做。
else可以省略。
一、
1.
.cs 類
2.
引用命名空間
3.
Main函數是程序的主入口,程序寫在Main函數下才可被執(zhí)行
4.
.sln : 解決方案文件
.csproj :項目文件
二、
1.
Console,WriteLine("要打印的內容");
Console,ReadKey();//暫停當前程序,等待用戶按下任意鍵繼續(xù)
三、
1.Ctrl+K+D 快速對齊
2.Shift+Home Shift+End
3.Ctrl+K+C注釋選中的代碼
4.Ctrl+K+U取消注釋選中的代碼
5.折疊冗余代碼: #region #endregion
四、
1.
儲存整數100
數據類型:整數
在內存中開辟的空間應該是整數類型 int
2.
存儲變量的語法:
變量類型 變量名;
變量名=值;
3."="在這里并不表示等于,而是賦值,表示把等號右邊的值賦值給等號
左邊的變量
4.數據類型
1)、整數類型:int 只能存儲整數,不能存儲小數。
2)、小數類型:double 既能存儲整數,也能存儲橡樹,小數點后面的位
數 15~16位。
3)、金錢類型:decimal 用來存儲金錢,值后面需要加上一個m。
4)、字符串類型:string 用來存儲多個文本,也可以存儲空,字符串類
型需要被雙引號引起來
5)、字符類型:char 用來存儲單個字符,最多最少只能有一個字符,不
能儲存空,字符類型的值需要用單引號引起來
三、
1.給變量命名的時候要滿足兩個規(guī)范:
1)、Camel 駱駝命名規(guī)范,要求變量名首單詞的首字母要小寫,其余每
個單詞的首字母要大寫,多用于給變量或字段命名。
highSchoolStudent
2)、Pascal 命名規(guī)范:要求每個單詞的首字母都要大寫,其余字母小寫,
多用于給類或者方法命名。
HighSchoolStudent
2.賦值運算符
=; 表示賦值的意思,表示把等號右邊的值賦值給等號左邊的變量。
由等號連接的表達式稱之為賦值表達式。
注意:每個表達式我們都可以求解除一個定值,對于賦值表達式而言,等
號左邊的變量的值,就是整個賦值表達式的值。
int number=10;
3.+號的作用
1)、連接:當+號兩邊有一邊是字符串的時候,+號就起到連接的作用
2)、相加:當+兩邊是數字的時候,+號就起到相加的作用
4.占位符
使用方法:先挖個坑,再填個坑。
使用占位符需要注意的地方:
1、你挖了幾個坑,就填幾個坑,如果你多填了,沒效果
???????????????如果你少填了,報異常
2、輸出順序:按照挖坑的順序輸出
3.異常
異常是指:語法上沒有任何錯誤,只不過在程序運行期間,由于某些原因
出現了問題,使程序不能再正常運行,也被稱作Bug
4.轉義符
轉義符值得就是一個'\'+一個特殊的字符,組成了一個具有特殊含義的字
符。
\n 表示換行
\" 表示一個英文半角的雙引號
\t 表示一個TAB鍵的空格
\b 表示一個退格鍵,放到字符串的兩邊沒有效果
\\ 表示一個\
@符號
1.取消\在字符串中的轉義作用
2.將字符串按照編輯的原格式輸出
5.算數運算符
+
-
*
/
%
6.類型轉換
隱式類型轉換:
我們要求等號兩邊參與運算的操作書的類型必須一致,如果不一致,滿足
下列條件會發(fā)生自動類型轉換,或者稱之為隱式類型轉換。
兩種類型兼容
列如:int 和 double 兼容(都是數字類型)
目標類型大于原類型
列如:double > int (小的轉大的)
顯式類型轉換:
1.兩種類型相兼容 int-->double
2.大的轉成小的 double-->int
語法:
(待轉換的類型)要轉換的值;
總結:
自動類型轉換:int-->double
顯示類型轉換:double-->int
五、
1.如果兩個變量的類型相兼容,可以使用自動類型轉換或者強制類型轉換,
但是,如果兩個類型的變量不兼容,比如 string 和 int,這時候我們可
以使用一個叫做Convert的轉換工廠進行轉換。
注意:使用Convert進行轉換,也要滿足一個條件:
面上要過的去,比如:
string a = "123"// 可以轉成 int 或 double
string b = "123abc"//不可以轉成 int 或 double
2.算數運算符
++:分為前++和后++,不管是前++還是后++,最終的結果都是給這
個變量加一。
去別表現在表達式當中,如果是前++,則先給這個變量自身加一,然后
帶著這個加一后的值去參與運算。
如果是后++,則先拿原值參與運算,運算完成后,再將這個變量自身加
一。
--:同上。
3.
對于像++或--這樣只需要一個操作數就能完成的運算,我們稱之為一元
運算符。
+ - * / %對于這些需要兩個或以上才能完成運算的操作符,我們稱之為
二元運算符。
一元運算符的優(yōu)先級要高于二元運算符。
如果在一個表達式當中,既有一元運算符,又有二元運算符,我們首先計
算一元運算符。
4.關系運算符
>
<
>=
<=
==
!=
關系運算符是用來描述兩個事物之間的關系
由關系運算符連接的表達式稱之為關系表達式。
5.bool類型
在c#中我們用bool類型來描述對或者錯。
bool類型的值只有兩個 一個true 一個false
6.邏輯運算符
&&邏輯與
||邏輯或
!邏輯非
邏輯運算符兩邊放的一般都是關系表達式或者bool類型的值
5>3&&true
3>5||false
!表達式
邏輯表達式的結果同樣也是bool類型
7.復合賦值運算符
+=
-=
*=
/=
%=
8.順序結構:程序從Main函數進入,從上到下一行一行的執(zhí)行,不會落下
任何一行。
分支結構:if if-else
選擇結構:if else-if switch-case
循環(huán)結構:while do-while for foreach
9.if語句:
語法:
if(判斷條件)
{
要執(zhí)行的代碼;
}
判斷條件:一般為關系表達式或者bool類型的值。
執(zhí)行過程:程序運行到if處,首先判斷if所帶的小括號中的判斷條件,
如果條件成立,也就是返回true,則執(zhí)行if收帶的大括號中的代碼,
如果判斷條件不成立,也就是返回一個false,則跳過if結構,繼續(xù)向下
執(zhí)行。
if結構的特點,先判斷,再執(zhí)行,有可能一行代碼都不執(zhí)行
用于一種情況的判斷
如果你想表示的含義是當b的值為true的時候去執(zhí)行if中的代碼,
那么語法上==true可以省略
但是,如果你想表達的是當b==false的時候去執(zhí)行if中的代碼,
語法上==false不能省略
10.if-else
語法:
if(判斷條件)
{
執(zhí)行的代碼;
}
else
{
執(zhí)行的代碼;
}
執(zhí)行過程:程序執(zhí)行到if處,首先判斷if所帶的小括號中的判斷條件是否
成立,
如果成立,也就是返回一個true,則執(zhí)行if所帶的大括號中的代碼,
執(zhí)行完成后,跳出if結構。
如果if所帶的小括號中的判斷條件不成立,也就是返回一個false,
則跳過if語句,執(zhí)行else所帶的大括號中的語句,執(zhí)行完成后,
跳出if-else結構。
if-else結構的特點:先判斷,再執(zhí)行,最少都要執(zhí)行一條代碼。
用于兩種情況的判斷
10.if else-if
作用:用來處理多條件的區(qū)間性的判斷。
語法:
if(判斷條件)
{
要執(zhí)行的代碼;
}
else if(判斷條件)
{
要執(zhí)行的代碼;
}
else if(判斷條件)
{
要執(zhí)行的代碼;
}
else if(判斷條件)
{
要執(zhí)行的代碼;
}
......
else
{
要執(zhí)行的代碼;
}
執(zhí)行過程:程序首先判斷第一個if所帶的小括號中的判斷條件,如果條件
成立,也就是返回一個true,
則執(zhí)行該if所帶的大括號中的代碼,執(zhí)行完成后,立即跳出if else-if
結構。
如果第一個if所帶的判斷條件不成立,也就是返回一個false,則繼續(xù)向
下進行判斷,依次的判斷每一個if的判斷條件,如果成立,就執(zhí)行該if所
帶的大括號中的代碼,如果不成立,則繼續(xù)行俠判斷,
如果每個if所帶的判斷條件都不成立,就看當前這個if else-if結構中是
否存在else。
如果有else的話,則執(zhí)行else中所帶的代碼,如果沒有else,則整個
if else-if結構什么都不做。
else可以省略。
1)、程序調試
1)、寫完一段程序后,想看一下這段程序的執(zhí)行過程
2)、當你寫完這段程序后,發(fā)現程序并沒有按照你想象的樣子去執(zhí)行
調試方法:
1)、F11逐語句調試(單步調試)
2)、F10逐過程調試
3)、斷點調試
2、for循環(huán)
語法:
for(表達式1;表達式2;表達式3;)
{
循環(huán)體;
}
表達式1一般為聲明循環(huán)變量,記錄循環(huán)的次數(int i=0;)
表達式2一般為循環(huán)條件(i<10)
表達式3一般為改變循環(huán)條件的代碼,使循環(huán)條件終有一天不在成立(i++)
執(zhí)行過程:程序首先執(zhí)行表達式1,聲明了一個循環(huán)變量用來記錄循環(huán)的次數,
然后執(zhí)行表達式2,判斷循環(huán)條件是否成立,如果表達式2返回的結果為true,
則執(zhí)行循環(huán)體,如果不成立,則跳出for循環(huán)。
4、三元表達式
語法:
表達式1?表達式2:表達式3;
表達式1一般為一個關系表達式。
如果表達式1的值為true,那么表達式2的值就是整個三元表達式的值。
如果表達式1的值為false,那么表達式3的值就是整個三元表達式的值。
注意:表達式2的結果必須跟表達式3的結果類型一致,并且也要跟整個三元表
達式的結果類型一致。
1、常量
聲明常量的語法:
const 變量類型 變量名=值;
6、枚舉
語法:
[public] enum 枚舉名
{
值1,
值2,
值3,
......
}
public:訪問修飾符,公開的公共的,哪兒都可以訪問。
enum:關鍵字,聲明枚舉的關鍵字
枚舉名:要符合Pascal命名規(guī)范
將枚舉聲明到命名空間下面,類的外面,表示這個命名空間下,所有的類都可
以使用這個枚舉
枚舉就是一個變量類型,只是枚舉聲明、賦值、使用的方式跟那些普通的變量
類型不一樣
7、所有的類型都能轉換成string類型,調用ToString()
8、結構
可以幫助我們一次性聲明多個不同類型德變量。
語法:
[public] struct 結構名
{
成員;//字段
}
變量在程序運行期間只能存儲一個值,而字段可以存儲多個值。
9、數組
一次性存儲多個相同類型的變量。
語法:
數組類型[] 數組名=new 數組類型[數組長度];
10、冒泡排序:就是將一個數組中的元素按照從大到小或者從小到大的順序進
行排列。
11、方法
函數就是將一堆代碼進行重用的一種機制。
函數的語法:
[public] static 返回值類型 方法名([參數列表])
{
方法體;
}
public:訪問修飾符,公開的,公共的,哪兒都可以訪問。
static:靜態(tài)的
返回值類型:如果不需要返回值,寫void
方法名:pascal 每個單詞的首字母都大寫,其余字母小寫
參數列表:完成這個方法所必須要提供給這個方法的條件,如果沒有參數,小
括號也不能省略。
方法寫好后,如果想要被執(zhí)行,必須要在Main()函數中調用。
方法的調用語法:
類名.方法名();
12、return
1.在方法中返回要返回的值。
2.立即結束本次方法。
一、我們在Main()函數中,調用Test()函數,我們管Main()函數稱之為調用者,
管Test()函數稱之為被調用者。
如果被調用者想要得到調用者的值:
1.傳遞參數。
2.使用靜態(tài)字段來模擬全局變量。
1.返回值
二、不管是形參還是實參,都是在內存中開辟了空間的。
三、方法的功能一定要單一。
方法中最忌諱的就是出現讓用戶輸入等字眼
四、out、ref、params
1.out參數。
如果你在一個方法中,返回多個相同類型的值的時候,可以考慮返回一個數組。
但是,如果返回多個不同類型的值的時候,返回數組就不行了,那么這個時候,我們可以考慮使用out參數。
out參數就側重于在一個方法中可以返回多個不同類型的值。
2.ref參數
能夠將一個變量帶入一個方法中進行改變,改變完成后,再將改變后的值帶出方法。
ref參數要求在方法外必須為其賦值,而方法內可以不賦值。
3.params可變參數
將實參列表中跟可變參數類型一致的元素都當作數組的元素去處理。
params可變參數必須是形參列表中的最后一個元素。
五、方法的重載
概念:方法的重載指的就是方法的名稱相同,但是參數不同。
1.如果參數的個數相同,那么參數的類型就不能相同。
2.如果參數的類型相同,那么參數的個數就不能形同。
*方法的重載跟返回值沒有關系。
六、方法的遞歸
方法自己調用自己。
找出一個文件夾中所有的文件。
一、面向過程------>面向對象
面向過程:面向的是完成這件事的過程,強調的是完成這件事的動作
1.打開冰箱門
2.把大象塞進冰箱
3.關閉冰箱門
如果我們用面向過程的思想來解決這件事兒,當執(zhí)行這件事的人不同的時候,我們需要為每一個不同的人量身定做解決事情的方法
面向對象:找個對象幫你做事
把大象塞進冰箱里
1.冰箱門可以被打開
2.大象可以被塞進冰箱里
3.冰箱門可以被關閉
面向對象意在寫出一個通用的代碼,屏蔽差異
關門
面向過程:關門
張三:一腳把門踹緊了
李四:輕輕的把門帶上了
王五:門沒關嚴,留了個尾巴
面向對象:關門
門可以被關閉
姓名:孫全
特征:
性別:男
身高:180cm
體重:70kg
年齡:22歲
行為:
吃喝拉撒睡一切正常 健康
吃喝嫖賭抽
特征:
姓名:顏德偉
性別:男
身高:160cm
體重:60kg
年齡:18
行為:
腦殘 身體健康
我們在代碼中描述一個對象,通過描述這個對象的屬性和方法
對象必須是看的見摸得著的
燈:屬性和方法
屬性:
外形:圓的
功耗:500w
顏色:白色
牌子:xx
方法:發(fā)光
電風扇:屬性、方法
外形:三個葉片
顏色:白色
品牌:xx
方法:轉動、扇風
我們把這些具有相同屬性和相同方法的對象進行進一步的封裝,抽象出來“類”這個概念
類是一張圖紙,確定了對象具有的屬性和方法
對象是根據類創(chuàng)建出來的
類就是一個蓋大樓的圖紙,對象就是蓋出來的大樓
2、類
語法:
[public] class <類名>
{
字段;
屬性;
方法;
}
寫好了一個類后,我們需要創(chuàng)建這個類的對象,
我們稱創(chuàng)建這個類的過程叫做實例化。
使用關鍵字new
this:表示當前這個類的對象
類是不占內存的,而對象是占內存的
3、屬性
屬性的作用就是保護字段、對字段的賦值和取值進行限定
屬性的本質就是兩個方法,一個叫 get ( ) 一個叫 set ( )?
既有get( )也有set( )我們稱之為可讀可寫屬性
只有get( )沒有set( )我們稱之為只讀屬性
沒有get( )只有set( )我們稱之為只寫屬性
Field 字段
Method 方法
property 屬性
4、訪問修飾符
public:公開的公共的,在哪兒都能訪問。
private:私有的,只能在當前類內部進行訪問,出了這個類就訪問不到了
5、
當我們創(chuàng)建好一個類的對象后。需要給這個對象的每個屬性去賦值
我們管這個過程稱之為對象的初始化
6、靜態(tài)和非靜態(tài)的區(qū)別
1.在非靜態(tài)類中,既可以有實例成員(非靜態(tài)成員),也可以有靜態(tài)成員
2.在調用實例成員的時候,需要使用對象名.實例成員;
??在調用靜態(tài)成員的時候,需要使用類名.靜態(tài)成員名;
總結:靜態(tài)成員必須使用類名去調用,而實例成員使用對象名調用。
?????靜態(tài)函數中,只能訪問靜態(tài)成員,不允許訪問實例成員。
?????靜態(tài)函數中,既可以使用靜態(tài)成員,也可以使用實例成員
?????靜態(tài)類中只允許有靜態(tài)成員,不允許出現實例成員
使用:
1.如果你想要你的類當作一個“工具類”去使用,這個時候可以考慮將類寫成靜態(tài)的
2.靜態(tài)類在整個項目中資源共享
只有在程序結束之后,靜態(tài)類才會釋放資源
堆 棧 靜態(tài)存儲區(qū)
釋放資源 GC Garbage Collection 垃圾回收器
7、構造函數
作用:幫助我們初始化對象(給對象的每個屬性依次的賦值)
構造函數是一個特殊的方法:
1.構造函數沒有返回值,連void也不能寫。
2.構造函數的名稱必須和類名一樣。
創(chuàng)建對象的時候會執(zhí)行構造函數
構造函數是可以重載的
***
類當中會有一個默認的無參數的構造函數,當你寫了一個新的構造函數之后,不管是不是無參數的,那個默認的無參數的構造函數都被干掉了。
8、new關鍵字
Person zsPerson=new Person( );
new幫我們做了3件事兒:
1.在內存中開辟一塊空間
2.在開辟的空間中創(chuàng)建對象
3.調用對象的構造函數進行初始化對象
9、this關鍵字
1.代表當前類的對象
2.在類當中顯示的調用本類的構造函數 :this
10、析構函數
當程序結束時,析構函數才執(zhí)行,幫助我們釋放資源,不寫析構函數GC會自動清理釋放資源
語法:
~類名( ) { }
二、面向對象繼承
1、命名空間
可以認為類是屬于命名空間的。
如果在當前項目中沒有這個類的命名空間,需要我們手動導入這個類所在的命名空間(類似C語言的頭文件,python里的import)
2、在一個項目中引用另一個項目的類
1.添加引用
2.引用命名空間
3、值傳遞和引用傳遞
區(qū)別
1.值傳遞和引用傳遞在內存上存儲的地方不一樣。
2.在傳遞值類型和傳遞引用類型的時候,傳遞的方式不一樣。
值類型我們稱之為值傳遞,引用類型我們稱之為引用傳遞。
目前學過的值類型和引用類型:
值類型:int、double、bool、char、decimal、struct、enum
引用類型:string、數組、自定義類
存儲:
值類型的值是存儲在內存的棧當中的。
引用類型的值是存儲在內存的堆中的。
3、字符串
1.字符串的不可變性
當你給一個字符串重新賦值之后,舊值并沒有被銷毀,而是重新開辟一塊內存空間存儲新值。
當程序結束后,GC掃描整個內存,如果發(fā)現有的空間沒有被指向,則立即把它銷毀。
2.我們可以將字符串看作是char類型的一個只讀數組。
ToCharArray( );將字符串轉換為char數組
new string( char[ ] chs);能夠將char數組轉換為字符串
4、字符串提供的各種方法
1.Length:獲得當前字符串中字符的個數
2.ToUpper( )將字符串轉換為大寫形式
3.ToLower( )將字符串轉換為小寫形式
4.Equals(lessonTwo,StringComparison.OrdinalIgnoreCase)比較兩個字符串,并忽略大小寫
5.Split( )分割字符串,返回字符串類型的數組
6.Substring( )截取字符串,在截取的時候包含要截取的那個位置
7.Indexof( )判斷某個字符串中第一次出現的位置,如果沒有則返回-1
8.LastIndexOf( )確定字符串中最后一次出現的字符串,如果沒有則返回-1
9.StartsWith( )判斷以...開始,結束:判斷以…結束
11. Replace( )將字符串中某個字符替換成一個新的字符串
12.Contains( )確定字符串是否包含指定的字符串
13.Trim( )去掉字符串中前后的空格
14.TrimEnd( )去掉字符串后面的空格
15.TrimStart( )去掉字符串前面的空格
16.isnulloempty( )確定字符串是空的還是null
17.string.Join( )將數組按照指定的字符串連接并返回一個字符串
5、繼承
我們可能會在一些類中,寫一些重復的成員,我們可以將這些重復的成員,單獨的封裝到一個類中,作為這些類的父類。
Student、Teacher、Driver?子類?派生類
Person????????????????父類?基類
子類繼承了父類,子類從父類那里繼承過來了什么?
首先,子類繼承了父類的屬性和方法,但是子類并沒有繼承父類的私有字段。
問題:子類有沒有繼承父類的構造函數?
答:子類沒有繼承父類的構造函數,但是,子類會默認的調用父類的無參數的構造函數,創(chuàng)建父類對象,讓子類可以使用父類中的成員。
所以,如果在父類中重寫了一個有參數的構造函數之后,那個無參數的就被干掉了,子類就調用不到了,所以子類會報錯。
解決辦法:
1.在父類中重新寫一個無參數的構造函數。
2.在子類中顯示的調用父類的構造函數,使用關鍵字:base( )
6、繼承的特性
1.繼承的單根性:一個子類只能有一個父類。
2.繼承的傳遞性
7、查看類圖
8、object是所有類的基類。
9、new關鍵字
1.創(chuàng)建對象
2.隱藏從父類那里繼承過來的同名成員
隱藏的后果就是子類調用不到父類的成員
三、
1、里氏轉換
1)子類可以賦值給父類:如果有一個地方需要一個父類作為參數,我們可以給一個子類代替
2)如果父類中裝的是子類對象,那么可以將這個父類強轉為子類對象,
2、
子類對象可以調用父類中的成員,但是父類對象永遠都只能調用自己的成員。
3、
is:表示類型轉換,如果能夠轉換成功,則返回一個true,否則返回一個false
as:表示類型轉換,如果能夠轉換則返回對應的對象,否則返回一個null
4、protected修飾符
protected:受保護的,可以在當前類的內部以及該類的子類中訪問
5、ArrayList集合
1)集合與數組的區(qū)別
集合:很多數據的一個集合
數組:長度不可變、類型單一
集合的好處:長度可以任意改變,類型任意
2)ToString的問題
我們將一個對象輸出到控制臺 默認情況下 打印的就是這個對象所在的類的命名空間
3)ArrayList的方法
list.Clear();//清空所有元素
list.Remove(true);//刪除單個元素,寫誰就刪誰
list.RemoveAt(0);//根據下標刪除元素
list.RemoveRange(0, 3);//根據下標去移除一定范圍的元素
list.Sort();//升序排列
list.Reverse();//反轉
list.Insert(0,'我');//插入單個元素
list.InsertRange(5, new string[] {"張三","李四"});//在指定的位置插入一個集合
4)長度的問題
每次集合中實際包含的元素個數(count)超過了可以包含的元素個數(capcity)的時候,集合就會向內存中多開辟一倍的內存空間,來保證集合的長度一直夠用。
6、Hashtable鍵值對集合
在鍵值對集合中,是根據鍵去找值的
例如通過字典找字 sun --> 孫,拼音是“鍵”,找出來的字是“值”
鍵值對對象[鍵]=值;
注意***:鍵值對集合當中,鍵必須是唯一的,而值是可以重復的
7、var推斷類型
var:能夠根據值推斷出來類型
C#是一門強類型語言:在代碼當中,必須對每一個變量的類型有一個明確的定義
//int n = 15;
js是一門弱類型語言:會根據值對類型做出判斷(ps:B站就是因為使用了弱類型語言導致了一次崩潰。具體詳見:BV18U4y1B7nA)
//12 3.14 true "fdfds" 'c' 都能用var
8、foreach循環(huán)
語法:
foreach (var item in collection) {
}
//item表示集合中元素的標識符,collection表示集合
9、Path類
常用的Path.方法:
//獲得文件名
Path.GetFileName(str);
//獲得文件名但是不包含拓展名
Path.GetFileNameWithoutExtension();
//獲得文件的拓展名
Path.GetExtension();
//獲得文件所在的文件夾的名稱
Path.GetDirectoryName();
//獲得文件的全路徑
Path.GetFullPath();
//連接兩個字符串作為路徑
Path.Combine(@"c:\a\" , "b.txt");
10、File類
//創(chuàng)建一個文件
//File.Create(@"盤符:\路徑\文件名.拓展名");
//刪除一個文件
//File.Delete();
//復制一個文件
File.Copy(@“盤符:\路徑\要復制的文件名.拓展名” , @"盤符:\路徑\復制后的文件名.拓展名")