二:物件和型別
類和結構
- 類是存在在堆上,結構是儲存在棧上
- 類可以繼承,結構不能繼承
- 類的定義是class,結構是struct
- 結構的效能要比類好,類的用處要比結構大
類
類的成員可訪問符public,protected,internal,internal protected,private
類的成員:
- 資料成員:欄位,常量,事件
- 函式成員:提供了操作類的資料的功能,包括方法,屬性,構造器,終接器,運算子和索引器。
靜態建構函式
特徵:只執行一次,建構函式執行的時間不確定,不同的靜態建構函式順序也就不確定。靜態建構函式沒有修飾符,因為C#程式碼不呼叫它,而是又.NET執行庫呼叫。
使用靜態建構函式的原因:類的一些靜態欄位或屬性,需要在第一次使用之前,從外部初始化。
靜態建構函式使用的示例
using System; namespace TestStaticConstructer { class Program { static void Main(string[] args) { Console.WriteLine(UserInterface.BackColor); Console.ReadLine(); } }View Codeclass UserInterface { public static readonly Color BackColor; static UserInterface() { DateTime dt = DateTime.Now; if ((dt.DayOfWeek == DayOfWeek.Sunday) || (dt.DayOfWeek == DayOfWeek.Saturday)) BackColor = Color.Green;else BackColor = Color.Red; } } enum Color { Green, Red, Yellow } }
只讀欄位
只讀欄位readonly和const的區別,readonly在類初始化之前不知道值,二const在一開始就已經確定了值。如pi的定義使用const。
匿名型別
var v1 = new { Name = "N1", Address = "A1" }; var v2 = new { Name = "N2", Address = "A2" }; var v3 = new { Name = "N3", address = "A3" }; Console.WriteLine(v1.Name + "-" + v1.Address); Console.WriteLine(v1.GetType() == v2.GetType()); Console.WriteLine(v1.GetType() == v3.GetType());
執行的結果如下
結構
先定義一個結構
struct Student { public string Name; }
測試結構
static void TestStruct() { Student s1 = new Student(); s1.Name = "Test"; Student s2; s2 = s1; Console.WriteLine(s1.Name+"-"+s2.Name); s2.Name = "New Name"; Console.WriteLine(s1.Name + "-" + s2.Name); }
這個示例可以看出類和結構的差別,如果是類,s2=s1這句話就意味著兩個類是同一個類,地址相同,修改任何一個變數的值另外一個也會跟著一起改變。
總結:結構是值型別,類是引用型別。
結構沒有繼承,唯一的例外是基類是System.Object,這意味著可以用Object類接收一個結構
弱引用
相對於正常的類,主要在作用域內記憶體就不會被回收。弱型別是隻要執行垃圾回收器,就會被釋放記憶體。用處是在佔用記憶體很大,又不經常用的情況。
(個人感覺沒啥用)
部分類
partial關鍵字允許把類的定義放在多個檔案中。partial可以修飾類,介面,結構。
partial class PartClass { public string FirstName; public void FirstFunction() { } }
partial class PartClass { public string LastName; }
只要引用了這兩個部分類的名稱空間,兩個部分類中定義的成員都可以使用。
靜態類
static的類,不能例項化,直接使用
Object類
所有的類的最終基類都是Sytem.Object。
該類的方法有ToString(),GetHashCode(),Equals(),Finalize(),GetType(),MemberwiseClone();
拓展方法
如果一個類已經封閉,或者是一個外部元件的類不能修改。新增方法的方法是使用拓展方法。