標籤:style blog color io 使用 ar strong sp 資料
一.結構
- 結構是一個實值型別。
- 使用struct關鍵字來定義一個結構,層級與類保持一致,寫在命名空間下面。
- 結構中可以定義欄位,屬性,方法,建構函式,也可以通過new關鍵字來建立對象。
- 結構中的欄位不能賦初始值。
- 無參數的建構函式無論如何C#編譯器都會產生,所以我們不能為結構體定義一個無參建構函式。
- 再建構函式中必須為結構體的所有欄位進行賦值。
- 再建構函式中為屬性賦值,不認為是對欄位賦值,因為屬性不一定是去操作欄位。
- 不能定義自動屬性,因為自動屬性會產生一個欄位,而這個欄位必須要求在建構函式中,但是我們又不知道這個欄位叫什麼名字。
- 當我們要表示一個輕量級的對象的時候,就可以定義結構,以提高速度。根據傳值的影響來選擇,希望傳引用就定義為類,希望穿拷貝就定義為結構。
二.記憶體回收機制
- Managed 程式碼和Unmanaged 程式碼。被CLR管理的代碼是Managed 程式碼,分配在棧空間的變數,一旦執行完其所在的範圍,這個變數就會被CLR立即回收。
- 實值型別變數的定義都是結構,分配再棧空間,參考型別變數的定義都是類,分配在堆空間。
- 分配在堆裡面的對象,當沒有任何變數引用他的時候,這個對象就被標記為“垃圾對象”,等待記憶體回收行程回收(Garbage Collection),GC會定時清理堆空間中的垃圾對象。
- GC清理垃圾的頻率程式員無法決定,CLR會根據電腦配置,代碼效能自動控制。
- GC代碼調用(“代”的概念):
GC.GetGeneration(p);得到指定對象所在的代;
GC.MaxGeneration;返回代數;
GC.Collection();立即讓記憶體回收行程對所有的代進行回收;
GC.Collection(int);對指定的代立即進行記憶體回收;
三.解構函式
樣本:
~Person()
{
Console.WriteLine(“我是解構函式!”);
}
- 不能有存取修飾詞,不能有參數;
- 在對象被記憶體回收行程回收的時候,解構函式被GC自動調用;
- 執行一些清理善後的操作的時候,會用到解構函式。
四.靜態成員
- 靜態成員是被static關鍵字修飾的,是屬於類的,通過類名.靜態成員來訪問。
執行個體成員是沒有static關鍵字修飾的,是屬於對象的,通過對象名.執行個體成員來訪問。
2.在一個類被載入的時候,這個類下的所有靜態成員都會被載入。
3.靜態成員只被建立一次,所以靜態成員在整個程式的運行中只有一份,而對於樣本成員來說,有多少對象就有多少份。
4.靜態成員會被建立在靜態儲存區中,一旦建立,直到程式退出才會被回收。靜態成員一定程度上會對程式的效率產生影響。
5.變數需要被共用,在整個程式中需要經常被調用的時候,就可以將這些成員定義為靜態成員。
6.在靜態方法中,不能直接調用執行個體成員,因為靜態方法被調用的時候,對象還有可能不存在。
7.this/base關鍵字在靜態方法中不能使用,因為有可能對象還不存在。
8.在執行個體方法中可以調用靜態成員,因為這個時候,靜態成員肯定存在。
靜態成員和執行個體成員的比較:
(1)生命週期;
(2)儲存位置;
五.靜態類
- 被static關鍵字修飾的類。
- 靜態類中只能聲明靜態成員。
- 靜態類中不能有執行個體建構函式。
- 靜態類不能被執行個體化,因為沒有執行個體成員,執行個體化沒有意義。
- 靜態類也不能被繼承。
- 靜態類的本質是抽象的密封類。
- 如果一個類下面的所有成員都需要被共用,就把這個類定義為靜態類。
- 不能聲明一個靜態類型的變數。
六.靜態建構函式
- 非靜態類都可以有靜態建構函式
- 一個類的成員第一次被訪問的時候就會執行靜態建構函式,只被執行一次,無論以後再次調用,都不會執行靜態建構函式了。
程式樣本:
1 public class Person 2 { 3 static public int num; 4 public Person() 5 { 6 num=1; 7 Console.WriteLine("執行個體建構函式"); 8 } 9 static Person()10 {11 num=2;12 Console.WriteLine("靜態建構函式");13 }14 }15 static void Main(string[] args)16 {17 Console.WriteLine(Person.num); //輸出:218 Person p = new Person();19 Console.WriteLine(Person.num); //輸出:120 Console.ReadKey();21 }
七.繼承
- 建立子類對象的時候,再子類對象中會為子類對象的欄位開闢空間,也會為父類對象的所有欄位開闢空間。
- 子類從父類繼承父類所有的非私人成員。
- base關鍵字可以調用父類的非私人成員,通過:base()可以調用父類的無參建構函式。
- 子類的存取層級不能高於父類。
- 建立子類對象的時候會調用父類的建構函式,如果父類沒有無參建構函式,子類會報錯,因為子類對象會預設調用父類的無參建構函式。
- 通過:base()可以顯示地調用父類的有參建構函式。
程式樣本:
1 public Student():base(12,”jack”,true)2 {3 Console.WriteLine(“我是子類建構函式……”);4 }
7. 在調用子類的時候,為防止資料衝突,會優先處理父類中的資料,完成父類資料的初始化。
8.繼承的特徵:
(1) 單根性,子類只能有一個父類;
(2) 傳遞性;
9.Object是所有類的祖宗類,所有的類都是從object類繼承的。
10.什麼情況下會用到繼承?
父類只要有一個功能不是子類所需要的,子類就不應該繼承,子類和父類是is a的關係。例如,狗會走,人也會走,但是Person類不能繼承Dog類;然而Student類可以繼承Person類。
11.子類成員與父類成員存在同名的時候?
父類與子類存在同名的時候,如果建立一個子類對象,調用這個子類對象的同名方法,會調用子類的。
12.new關鍵字的第二個作用,隱藏父類的同名成員。
程式樣本:
父類:
1 class Person2 {3 Public void Test()4 {5 Console.WriteLine(“我是父類的”);6 }7 }
子類:
1 class Student:Person2 {3 public new void Test()4 {5 Console.WriteLine(“我是子類的”);6 }7 }
.NET基礎回顧(二)