分類:C#、VS2015 編程
建立日期:2016-06-19 ide
使用教材:(十二五國家級規劃教材)《C#程序設計及應用教程》(第3版) 函數
別人提供的類都是爲了簡化你的工做量用的,但是實際處理的事情千差萬別,要經過寫代碼作實際的事,你還得本身定義類。所以,先把如何自定義類及其涉及的相關概念和要點掌握住,是寫程序繞不過去的第一關。 性能
一、基本格式 spa
[訪問修飾符] [static] class 類名 [: 基類 [,接口序列]] 設計
{ code
[類成員] 對象
} blog
要點: 繼承
(1)基類最多隻能有一個。若是不定義基類,默認繼承自System類。
(2)類成員包括字段、屬性、構造函數、方法、事件、運算符、索引器、析構函數等。
(3)絕大多數狀況下都不須要定義析構函數。只有在本身定義須要回收的資源而不是靠垃圾回收來自動對其進行清理時才須要定義析構函數。
示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Person { private static int n = 1; public string Name { get; set; } = string.Empty; public int Age { get; set; } = 0; public Person() { Console.WriteLine($"第{n++}次調用"); } } class Program { static void Main(string[] args) { Person p1 = new Person() { Name = "張三", Age = 20 }; Console.WriteLine($"姓名:{p1.Name},年齡:{p1.Age}"); Person p2 = new Person() { Name = "李四", Age = 22 }; Console.WriteLine($"姓名:{p2.Name},年齡:{p2.Age}"); Console.ReadLine(); } } }
二、訪問修飾符
(1)基本訪問修飾符
public:類的內部和外部代碼均可以訪問。
private:類的內部可訪問,類的外部沒法訪問。若是省略類成員的訪問修飾符,默認爲private。
internal:同一個程序集中的代碼均可以訪問,程序集外的其餘代碼沒法訪問。若是省略類的訪問修飾符,默認爲internal。
protected:類的內部或者從該類繼承的子類能夠訪問。
protected internal:從該類繼承的子類或者從另外一個程序集中繼承的類均可以訪問。
(2)特殊訪問修飾符
當將同一個類用多個不一樣的文件來分別描述時,還能夠在基本訪問修飾符的後面同時加上partial修飾符。好比多人同時寫同一個類時就能夠這樣用。
編譯器編譯源程序時,會自動將其合併到同一個類中。
三、構造函數
要點:
(1)構造函數是建立對象時自動調用的函數。通常在構造函數中作一些初始化工做,或者作一些僅需執行一次的特定操做。
(2)構造函數沒有返回類型,而且它的名稱與其所屬的類的名稱相同。
(3)構造函數可重載。
(4)在擴充類的構造函數中調用基類提供的方法時,用「base.方法名」實現。
四、靜態類和靜態方法
要點:
(1)能夠在方法名的前面加上static代表這是一個靜態方法。
(2)能夠在class的前面加上static代表所定義的類是一個靜態類。在這種狀況下,該類中的全部成員都必須是靜態的(都必須帶有static修飾符)。
(3)在C#語言中,經過「類名.方法名」來調用靜態方法,經過「實例名.方法名」來調用實例方法。
(4)靜態方法能夠被重載但不能被重寫。
注意:
(1)聲明爲static的成員在內存中只有一份。
(2)首次調用時加載到內存,全部成員都再也不調用時從內存中移除,這些工做都是由垃圾回收器自動完成的。
五、屬性
要點:
(1)屬性(property)是字段的擴展,用於提供對字段讀寫的手段。
(2)屬性和字段的區別是屬性不表示存儲位置,而是經過get訪問器和set訪問器指定讀寫字段的值時須要執行的語句。根據使用狀況不一樣,能夠只提供get訪問器或者只提供set訪問器,也能夠二者同時提供。
(3)基本用法示例:
public string Name { get; set; } = string.Empty;
public int Age { get; set; } = 0;
public int Grade { get; private set; }
六、方法
要點:
(1)定義方法時,在參數名的前面可使用的關鍵字有:
ref、out、params
(2)若是定義方法時不在參數名的前面添加關鍵字,必定要注意默認狀況下值類型和引用類型的調用區別。
(3)方法重載
指具備相同的方法名,但「參數類型」或「參數個數」不徹底相同的多個方法能夠同時出如今同一個類中。在項目開發過程當中,不少方法都須要使用方法重載來實現。
七、事件
事件是靠委託來實現的。因爲項目中會大量使用委託和事件完成各類功能,所以後面用單獨的一章介紹它。
八、類的封裝、繼承和多態性
屬於高級用法,與編程經驗關係很大,是初學者的難點但也是項目中最能體現核心技術的優點和差異的地方。
(1)封裝
抽象類:用abstract關鍵字聲明。抽象就是把公用的東西抽取出來放到一個單獨的類中,這樣既能夠要求擴充類必須實現某些在抽象類中僅有聲明沒有實現的方法,也能夠在抽象類中直接實現某些你們公用的方法。
密封類:用sealed關鍵字聲明。在類的定義中使用該關鍵字代表該類不能被繼承,在方法的定義中使用該關鍵字代表該方法不能被重寫。
(2)繼承
繼承的目的是爲了不重複寫相同的代碼。若是用不太嚴謹的說法來描述它,可將其理解爲對要處理的事情分層管理。
要注意繼承中構造函數的處理。
(3)多態
注意下列關鍵字的用法:
virtual、override:基類的方法定義中用virtual表示該方法能夠被擴充類重寫,擴充類中用override表示該方法重寫的是基類中同名的方法。
new:基類的方法定義中沒有用virtual聲明(即:不容許被重寫),可是你仍然須要重寫它,此時能夠用這個關鍵字。
要點:
(1)自定義結構時,用struct關鍵字。從定義形式上看,它和類的區別僅有一個單詞不同(結構用struct關鍵字聲明,而類用class關鍵字聲明),其餘都同樣。
(2)結構不能被繼承。
(3)結構和類的區別在於執行時的性能:結構的變量值都是在棧中保存的(速度快),而類的變量值都是在堆中保存的(慢一點)。
(4)凡是自定義的結構,均可以用自定義的類來實現。若是搞不清用結構好仍是用類好,那就暫不考慮性能,所有都用類來實現就好了。隨着開發經驗的增長,你之後天然會理解哪些狀況下應該用結構來實現。