.NET基礎回顧(二)

來源:互聯網
上載者:User

標籤:style   blog   color   io   使用   ar   strong   sp   資料   

一.結構

  1. 結構是一個實值型別。
  2. 使用struct關鍵字來定義一個結構,層級與類保持一致,寫在命名空間下面。
  3. 結構中可以定義欄位,屬性,方法,建構函式,也可以通過new關鍵字來建立對象。
  4. 結構中的欄位不能賦初始值。
  5. 無參數的建構函式無論如何C#編譯器都會產生,所以我們不能為結構體定義一個無參建構函式。
  6. 再建構函式中必須為結構體的所有欄位進行賦值。
  7. 再建構函式中為屬性賦值,不認為是對欄位賦值,因為屬性不一定是去操作欄位。
  8. 不能定義自動屬性,因為自動屬性會產生一個欄位,而這個欄位必須要求在建構函式中,但是我們又不知道這個欄位叫什麼名字。
  9.  當我們要表示一個輕量級的對象的時候,就可以定義結構,以提高速度。根據傳值的影響來選擇,希望傳引用就定義為類,希望穿拷貝就定義為結構。

二.記憶體回收機制

                       

  1. Managed 程式碼和Unmanaged 程式碼。被CLR管理的代碼是Managed 程式碼,分配在棧空間的變數,一旦執行完其所在的範圍,這個變數就會被CLR立即回收。
  2. 實值型別變數的定義都是結構,分配再棧空間,參考型別變數的定義都是類,分配在堆空間。
  3. 分配在堆裡面的對象,當沒有任何變數引用他的時候,這個對象就被標記為“垃圾對象”,等待記憶體回收行程回收(Garbage Collection),GC會定時清理堆空間中的垃圾對象。
  4. GC清理垃圾的頻率程式員無法決定,CLR會根據電腦配置,代碼效能自動控制。
  5. GC代碼調用(“代”的概念):

  GC.GetGeneration(p);得到指定對象所在的代;

  GC.MaxGeneration;返回代數;

  GC.Collection();立即讓記憶體回收行程對所有的代進行回收;

  GC.Collection(int);對指定的代立即進行記憶體回收;

三.解構函式

樣本:

~Person()

{

         Console.WriteLine(“我是解構函式!”);

}

  1. 不能有存取修飾詞,不能有參數;
  2. 在對象被記憶體回收行程回收的時候,解構函式被GC自動調用;
  3. 執行一些清理善後的操作的時候,會用到解構函式。

四.靜態成員

  1. 靜態成員是被static關鍵字修飾的,是屬於類的,通過類名.靜態成員來訪問。

     執行個體成員是沒有static關鍵字修飾的,是屬於對象的,通過對象名.執行個體成員來訪問。

  2.在一個類被載入的時候,這個類下的所有靜態成員都會被載入。

  3.靜態成員只被建立一次,所以靜態成員在整個程式的運行中只有一份,而對於樣本成員來說,有多少對象就有多少份。

  4.靜態成員會被建立在靜態儲存區中,一旦建立,直到程式退出才會被回收。靜態成員一定程度上會對程式的效率產生影響。

  5.變數需要被共用,在整個程式中需要經常被調用的時候,就可以將這些成員定義為靜態成員。

  6.在靜態方法中,不能直接調用執行個體成員,因為靜態方法被調用的時候,對象還有可能不存在。

  7.this/base關鍵字在靜態方法中不能使用,因為有可能對象還不存在。

  8.在執行個體方法中可以調用靜態成員,因為這個時候,靜態成員肯定存在。

  靜態成員和執行個體成員的比較:

  (1)生命週期;

  (2)儲存位置;

五.靜態類

  1. 被static關鍵字修飾的類。
  2. 靜態類中只能聲明靜態成員。
  3. 靜態類中不能有執行個體建構函式。
  4. 靜態類不能被執行個體化,因為沒有執行個體成員,執行個體化沒有意義。
  5. 靜態類也不能被繼承。
  6. 靜態類的本質是抽象的密封類。
  7. 如果一個類下面的所有成員都需要被共用,就把這個類定義為靜態類。
  8. 不能聲明一個靜態類型的變數。

六.靜態建構函式

  1. 非靜態類都可以有靜態建構函式
  2. 一個類的成員第一次被訪問的時候就會執行靜態建構函式,只被執行一次,無論以後再次調用,都不會執行靜態建構函式了。

程式樣本:

 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         }

七.繼承

  1. 建立子類對象的時候,再子類對象中會為子類對象的欄位開闢空間,也會為父類對象的所有欄位開闢空間。
  2. 子類從父類繼承父類所有的非私人成員。
  3. base關鍵字可以調用父類的非私人成員,通過:base()可以調用父類的無參建構函式。
  4. 子類的存取層級不能高於父類。
  5. 建立子類對象的時候會調用父類的建構函式,如果父類沒有無參建構函式,子類會報錯,因為子類對象會預設調用父類的無參建構函式。
  6. 通過: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基礎回顧(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.