C#進階編程(三)-對象和類型詳解

來源:互聯網
上載者:User

3.2 類和結構

  類與結構的區別是它們在記憶體中的儲存方式訪問方式(類似儲存在堆上的參考型別,而結構是儲存在棧上的實值型別)和它們的一些特徵

  文法上,類與結構非常相似,主要區別是結構使用關鍵字 struct 代替 class 來聲明。

3.3 類成員

  3.3.1 資料成員

    資料成員是包含類資料—欄位常量事件的成員。

  3.3.2 函數成員

    函數成員提供了操作類中資料的某些功能,包括方法屬性建構函式解構函式(終結器)運算子以及索引器


    1. 方法

        ref out 的區別:

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

        ref 的實質是將實值型別進行引用傳遞,而 out 是為了增加傳回值。

        具名引數:在傳遞參數的過程中可以指定其名字,格式為 MethodName (ParameterName : Value )

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

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


    1. 屬性

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

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

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

        屬性的存取修飾詞:在get和set訪問器中,必須有一個具備屬性的存取層級。


    1. 建構函式

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

        如果提供了帶參數的建構函式,編譯器就不會自動提供預設的建構函式。

        (1)靜態建構函式

          編寫靜態建構函式的原因:類中有一些靜態欄位或屬性,需要在第一次使用類之前,從外部源中初始化這些欄位和屬性。

          .NET運行庫沒有確保什麼時候去執行靜態建構函式,所以不應該要求在某個特定時刻執行靜態建構函式中的代碼。但可以確保的是,它在所有引用前只會調用一次。

          無參建構函式可以與靜態建構函式在同一個類中定義。

        (2)從建構函式中調用其它建構函式

          base this 關鍵字

   3.3.3 唯讀欄位

    readonly const 的區別:

    readonly 可以在建構函式中賦值,而 const 哪裡都不能賦值,只能初始化。

3.4 匿名型別

    var new 關鍵字一起使用可以建立匿名型別,例如。

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 AddMyClass25             {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 後的類,這個方法就是這個類的一部分。

  •     即是擴充方法是一個靜態方法,也要使用調用執行個體方法的文法經行調用。

  •     如果擴充方法與類中某個方法同名,就從來不會調用擴充方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.