分類:C#、VS2015
創建日期:2016-06-19
使用教材:(十二五國家級規劃教材)《C#程序設計及應用教程》(第3版)
別人提供的類都是為了簡化你的工作量用的,可是實際處理的事情千差萬別,要通過寫代碼做實際的事,你還得自己定義類。因此,先把如何自定義類及其涉及的相關概念和要點掌握住,是寫程序繞不過去的第一關。
1、基本格式
[訪問修飾符] [static] class 類名 [: 基類 [,接口序列]]
{
[類成員]
}
要點:
(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(); } } }
2、訪問修飾符
(1)基本訪問修飾符
public:類的內部和外部代碼都可以訪問。
private:類的內部可訪問,類的外部無法訪問。如果省略類成員的訪問修飾符,默認為private。
internal:同一個程序集中的代碼都可以訪問,程序集外的其他代碼無法訪問。如果省略類的訪問修飾符,默認為internal。
protected:類的內部或者從該類繼承的子類可以訪問。
protected internal:從該類繼承的子類或者從另一個程序集中繼承的類都可以訪問。
(2)特殊訪問修飾符
當將同一個類用多個不同的文件來分別描述時,還可以在基本訪問修飾符的後面同時加上partial修飾符。比如多人同時寫同一個類時就可以這樣用。
編譯器編譯源程序時,會自動將其合並到同一個類中。
3、構造函數
要點:
(1)構造函數是創建對象時自動調用的函數。一般在構造函數中做一些初始化工作,或者做一些僅需執行一次的特定操作。
(2)構造函數沒有返回類型,並且它的名稱與其所屬的類的名稱相同。
(3)構造函數可重載。
(4)在擴充類的構造函數中調用基類提供的方法時,用“base.方法名”實現。
4、靜態類和靜態方法
要點:
(1)可以在方法名的前面加上static表明這是一個靜態方法。
(2)可以在class的前面加上static表明所定義的類是一個靜態類。在這種情況下,該類中的所有成員都必須是靜態的(都必須帶有static修飾符)。
(3)在C#語言中,通過“類名.方法名”來調用靜態方法,通過“實例名.方法名”來調用實例方法。
(4)靜態方法可以被重載但不能被重寫。
注意:
(1)聲明為static的成員在內存中只有一份。
(2)首次調用時加載到內存,所有成員都不再調用時從內存中移除,這些工作都是由垃圾回收器自動完成的。
5、屬性
要點:
(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; }
6、方法
要點:
(1)定義方法時,在參數名的前面可以使用的關鍵字有:
ref、out、params
(2)如果定義方法時不在參數名的前面添加關鍵字,一定要注意默認情況下值類型和引用類型的調用區別。
(3)方法重載
指具有相同的方法名,但“參數類型”或“參數個數”不完全相同的多個方法可以同時出現在同一個類中。在項目開發過程中,很多方法都需要使用方法重載來實現。
7、事件
事件是靠委托來實現的。由於項目中會大量使用委托和事件完成各種功能,因此後面用單獨的一章介紹它。
8、類的封裝、繼承和多態性
屬於高級用法,與編程經驗關系很大,是初學者的難點但也是項目中最能體現核心技術的優勢和差別的地方。
(1)封裝
抽象類:用abstract關鍵字聲明。抽象就是把公用的東西抽取出來放到一個單獨的類中,這樣既可以要求擴充類必須實現某些在抽象類中僅有聲明沒有實現的方法,也可以在抽象類中直接實現某些大家公用的方法。
密封類:用sealed關鍵字聲明。在類的定義中使用該關鍵字表明該類不能被繼承,在方法的定義中使用該關鍵字表明該方法不能被重寫。
(2)繼承
繼承的目的是為了避免重復寫相同的代碼。如果用不太嚴謹的說法來描述它,可將其理解為對要處理的事情分層管理。
要注意繼承中構造函數的處理。
(3)多態
注意下列關鍵字的用法:
virtual、override:基類的方法定義中用virtual表示該方法可以被擴充類重寫,擴充類中用override表示該方法重寫的是基類中同名的方法。
new:基類的方法定義中沒有用virtual聲明(即:不允許被重寫),但是你仍然需要重寫它,此時可以用這個關鍵字。
要點:
(1)自定義結構時,用struct關鍵字。從定義形式上看,它和類的區別僅有一個單詞不一樣(結構用struct關鍵字聲明,而類用class關鍵字聲明),其他都一樣。
(2)結構不能被繼承。
(3)結構和類的區別在於執行時的性能:結構的變量值都是在棧中保存的(速度快),而類的變量值都是在堆中保存的(慢一點)。
(4)凡是自定義的結構,都可以用自定義的類來實現。如果搞不清用結構好還是用類好,那就暫不考慮性能,全部都用類來實現就行了。隨著開發經驗的增加,你以後自然會理解哪些情況下應該用結構來實現。