C#高級編程筆記之第三章:對象和類型

 

 

3.2 類和結構

  類與結構的區別是它們在內存中的存儲方式訪問方式(相似存儲在堆上的引用類型,而結構是存儲在棧上的值類型)和它們的一些特徵html

  語法上,類與結構很是類似,主要區別是結構使用關鍵字 struc代替 class 來聲明。編程

 

3.3 類成員

  3.3.1 數據成員函數

    數據成員是包含類數據—字段常量事件的成員。佈局

 

  3.3.2 函數成員post

    函數成員提供了操做類中數據的某些功能,包括方法屬性構造函數析構函數(終結器)運算符以及索引器性能

    1. 方法

        ref 和 out 的區別:this

        ref 在傳遞以前必須已經被初始化,out 則不要求。url

        ref 的實質是將值類型進行引用傳遞,而 out 是爲了增長返回值。spa

        命名參數:在傳遞參數的過程當中能夠指定其名字,格式爲 MethodName (ParameterName : Value )code

        Params 關鍵字 : 必須在方法參數的最後面。

        方法的重載:不能僅在返回類型上有區別,不能僅根據聲明 ref 、 out 或 params 之間區分。

 

    1. 屬性

        概念:屬性是一個或一對方法,在客戶端代碼看來,它(們)是一個字段。

        get訪問器不帶任何參數,且返回屬性聲明的類型。

        set訪問器帶一個value參數,其類型與聲明的類型相同。

        屬性的訪問修飾符:在getset訪問器中,必須有一個具有屬性的訪問級別。

 

    1. 構造函數

        聲明構造方式就是聲明一個與包含的類同名的方法,但該方法沒有返回值。

        若是提供了帶參數的構造函數,編譯器就不會自動提供默認的構造函數。

 

        (1)靜態構造函數

          編寫靜態構造函數的緣由:類中有一些靜態字段或屬性,須要在第一次使用類以前,從外部源中初始化這些字段和屬性。

          .NET運行庫沒有確保何時去執行靜態構造函數,因此不該該要求在某個特定時刻執行靜態構造函數中的代碼。但能夠確保的是,它在全部引用前只會調用一次。

          無參構造函數能夠與靜態構造函數在同一個類中定義。

 

        (2)從構造函數中調用其它構造函數

          base 與 this 關鍵字

 

   3.3.3 只讀字段

    readonly 與 const 的區別:

    readonly 能夠在構造函數中賦值,而 const 哪裏都不能賦值,只能初始化。

 

3.4 匿名類型

    var 和 new 關鍵字一塊兒使用能夠建立匿名類型,例如。

 1  static void Main(string[] args)
 2 
 3 
 4         {
 5 
 6 
 7             var test = new { Name = "Earl Jones", Age = 17 };
 8 
 9 
10             Console.WriteLine(test.ToString());
11 
12 
13             Console.WriteLine(test.Name.GetType().ToString());
14 
15 
16             Console.WriteLine(test.Age.GetType().ToString());
17 
18 
19             Console.ReadKey();
20 
21 
22         }

    輸出結果以下:

    

    咱們並不知道這個對象的類型,編譯器爲其「僞造」了一個名稱,可是隻有編譯器才能使用它,咱們不能也不該該使用新對象上的任何類型反射,由於這不會獲得一致的結果。

 

3.5 結構

  •   結構是值類型,不是引用類型,其生命週期的限制與簡單的數據類型同樣,傳遞結構時可使用ref關鍵字來減小性能損耗。
  •   結構通常用於表達簡單的組合數據。
  •   結構不支持繼承,但全部結構都繼承於System.ValueType,而System.ValueType又繼承於System.Object
  •   使用結構,能夠指定字段如何在內存中佈局。
  •   對於結構,編譯器老是提供默認無參構造函數,它不容許被替換,也不能在結構中爲字段提供初始值,必須在構造函數中提供。
  •   結構中的公有字段爲可接受的編程方式。
  •   在定義結構時使用new關鍵字只不過是用於調用其構造函數,變量的聲明實際上纔是爲結構分配空間,因此如下代碼不被報錯。
1 MyStruct myStruct /*= new MyStruct()*/; 2 myStruct.Name = "Earl Jones"; 3 myStruct.Age = 17;

  覆蓋結構默認的構造函數會報錯

    

 

 

3.6 弱引用

  在代碼中實例化一個類或結構時,只要有代碼引用它,就會造成強引用。

  強引用和弱引用的區別是,強引用只要有引用就不會被GC回收,而弱引用隨時均可能被GC回收,因此使用它的時候必須肯定其是否存活。如:

1  MyClass myClass; 2     WeakReference weakMyClass = new WeakReference(new MyClass());
3 if (weakMyClass.IsAlive) 4 { 5 myClass = weakMyClass.Target as MyClass; 6 Console.WriteLine(myClass.value); 7 }

 

3.7 部分類

  Partial關鍵字能夠容許把類、結構、方法或結構放在多個文件中。

  若是聲明相似使用了下面的關鍵字,這些關鍵字就必須應用於同一個類的全部部分:

  •   訪問修飾符
  •   abstract
  •   sealed
  •   new
  •   通常約束

 

3.9 Object

  全部類都繼承自System.Object類。

  方法:

  • ToString();
  • GetHashCode();
  • Equals();這裏有三個比較三個用於比較對象相等性的方法。
  • Finalize();
  • GetType();
  • GMemberwiseClone();

 

3.10 擴展方法

  擴展方法用於在某些不能直接修改源代碼中的類中添加方法。

 

 1         using System;
 2         
 3         namespace 擴展方法
 4         {
 5             class Program
 6             {
 7                 static void Main(string[] args)
 8                 {
 9                     MyClass myClass1 = new MyClass();
10                     myClass1.SayHiToSomeone();
11                     myClass1.SayHi();
12                     Console.ReadKey();
13                 }
14             }
15         
16             class MyClass
17             {
18                  public void SayHi()
19                 { 
20             Console.WriteLine("我是最原始的方法"); 
21             }
22             }
23         
24             static class AddMyClass
25             {
26                 static public void SayHiToSomeone(this MyClass myClass)
27                 { 
28             Console.WriteLine("我是一個擴展方法"); 
29             }
30         
31                 static public void SayHi(this MyClass myClass)
32                 {
33              Console.WriteLine("我是擴展方法SayHi");
34              }
35             }
36         }

  輸出的結果:

  

  由上得出:

  •     擴展方法必須定義在一個靜態類中。
  •     擴展方法的第一個參數爲放在 this 後的類,這個方法就是這個類的一部分。
  •     便是擴展方法是一個靜態方法,也要使用調用實例方法的語法經行調用。
  •     若是擴展方法與類中某個方法同名,就歷來不會調用擴展方法。

 

 

 

 

 

本文部分摘錄自C#高級編程第九版,其他由Earl Jones整理及總結而成,本人能力有限,若有紕漏望及時指出。

 

若是你喜歡此書,或想了解更詳細內容,請購買正版書籍進行查閱。

 

轉載請註明出處。

相關文章
相關標籤/搜索