1、什麼是類? 面向對象的語言,最基本的就是類。在C#中,類是這樣來定義的:類代表一組具有公共屬性和行為的對象。 舉個例子,現實生活中,人就是一個“類”,但這隻是一個統稱,指所有的人。我們要找個人一起去玩,此時就需要找到一個具體的人。比如我和小紅,我們兩個就是“人”這個類的兩個實例。 2、C#中如何 ...
1、什麼是類?
面向對象的語言,最基本的就是類。在C#中,類是這樣來定義的:類代表一組具有公共屬性和行為的對象。
舉個例子,現實生活中,人就是一個“類”,但這隻是一個統稱,指所有的人。我們要找個人一起去玩,此時就需要找到一個具體的人。比如我和小紅,我們兩個就是“人”這個類的兩個實例。
2、C#中如何定義一個類?
C#中採用關鍵詞class來定義。
class 類名{}
class前面還可以有訪問修飾符進行修飾。
訪問修飾符 | 說明 |
public | 公有訪問。不受任何限制。 |
private | 私有訪問。只限於本類成員訪問,子類,實例都不能訪問。 |
protected | 保護訪問。只限於本類和子類訪問,實例不能訪問。 |
internal | 內部訪問。只限於本項目內訪問,其他不能訪問。 |
protected internal | 內部保護訪問。只限於本項目或是子類訪問,其他不能訪問 |
3、類的成員
類的成員包括欄位、屬性、方法和構造函數等。它們與類一樣,都有自己的訪問許可權。也可以使用static關鍵字將其聲明為類的靜態成員,註意,靜態成員屬於類級別的概念,不屬於類的實例。
3.1 欄位
欄位由三個部分組成-訪問修飾符,欄位的類型和欄位名字。
public class Person
{
private string name;
public int age;
protected bool sex;
}
當然,也可以使用readonly和const來修飾,readonly不需要定義時初始化,可以在構造函數中進行初始化,而const修飾欄位也必須定義欄位的時候就完成初始化。
類可以用static進行修飾,欄位也可以使用static。當欄位使用static進行修飾的時候,只能使用 類名.欄位名進行訪問。
3.2 屬性
屬性是對欄位的擴展
public class Person
{
private string name;
public string Name
{
get{return name;}
set{name=value;}
}
}
屬性定義主要由get訪問器和set訪問器組成。前面有介紹過,屬性中get和set在IL代碼中,是被編譯成兩個方法的。用屬性來包裝欄位是因為可以更好的保護欄位,可以根據需要加入更多的邏輯控制代碼。當然,屬性也可以使用static關鍵字進行聲明,跟欄位是一樣的,屬於類級別,不能通過類的實例進行訪問,也不能在靜態屬性中使用非靜態欄位。
3.3 方法
方法=方法簽名+一系列語句的代碼
public class Person
{
public void Print(string name)
{
Console.WriteLine("aaaa");
}
}
方法也可以使用static關鍵字進行修飾,此時的靜態方法也屬於類級別的,不能用過類的實例進行訪問。
關於方法,還有一個很重要的地方,那就是方法重載,方法重載指的是在類中可以定義多個名稱相同但方法簽名不同的方法,這裡的方法簽名不同指的是方法的參數順序、參數類型和個數的不同(Warning:方法的返回值類型不屬於方法簽名的一部分)。
public class Person
{
public void Print(string name){}
public void Print(int age){}
}
3.4 構造函數
構造函數是用於創建類的實例對象的。當調用構造函數創建一個對象時,構造函數會為對象分配記憶體空間,並初始化類的成員。構造函數分為實例構造函數和靜態構造函數兩種。
(1)實例構造函數
一般在程式中,都是使用new關鍵字來創建對象的。new創建的過程,就是調用實例構造函數,來初始化類中所有的實例成員。
比如上面的Person類,雖沒有顯示寫出實例構造函數,但C#編譯器會幫我們自動生成一個函數體為空的預設午餐的實例構造函數。
構造函數有以下特點:
- 構造函數可以進行方法重載。
- 如果沒有為類顯示地定義一個構造函數,則C#編譯器會幫我們生成一個函數體為空的預設午餐的實例構造函數。
- 可以對實例構造函數指定訪問級別,即可以使用public、protected和private修飾符來修飾。
- 構造函數必須與類同名,並且不允許有返回類型。
(2)靜態構造函數
靜態構造函數用於初始化類中的靜態成員,在創建第一個實例或引用任何靜態成員之前,CLR都將自動調用靜態構造函數。
靜態構造函數有以下特點:
- 靜態構造函數不能使用任何訪問修飾符。
- 靜態構造函數不能帶有任何參數。
- 靜態構造函數只會執行一次。
- 不能直接調用靜態構造函數。
- 在程式中,程式員無法控制靜態構造函數的時機。
3.5 析構函數
析構函數用於在類銷毀之前釋放類實例所使用的托管和非托管資源。析構函數實際上是隱式地調用了基類Object的Finalize方法。
class Person
{
~Person()
{
Console.WriteLine("析構函數被調用了");
}
}
上面的析構函數代碼會被編譯器轉化為下麵的代碼:
protected override void Finalize()
{
try{Console.WriteLine("析構函數被調用了");}
finally{base.Finalize();}
}
在定義析構函數時必須要註意以下幾點:
- 不能在結構體中定義析構函數,只能對類使用析構函數。
- 一個類只能有一個析構函數。
- 無法繼承或重載析構函數。
- 無法顯示地調用析構函數,析構函數是由垃圾回收器自動調用的。
- 析構函數既沒有修飾符也沒有參數。
3.6 索引器
索引器的定義類似於屬性,也具有get訪問器和set訪問器。
[修飾符] 數據類型 this[索引類型 index]
{
get{//返回類中數組的某個元素;}
set{//對類中數組元素賦值;}
}
this表示所操作的是對類對象的數組成員
4、類實例化
前面說過了,要得到一個類的實例對象,就必須先聲明一個該類類型的變數,然後使用new運算符後跟類的實例構造函數來完成實例化。類的實例化對象是對類的具體化。
需要註意的是:只有包含實例構造函數的類才能被實例化,而在靜態類中是不能定義實例構造函數的。
5、類與結構體的區別
- 語法上的區別在於 定義類要使用關鍵字class,而結構體是使用關鍵字struct。
- 結構體中不可對聲明欄位欄位進行初始化,但類可以。
- 如果沒有味類顯示地定義構造函數,C#編譯器會自動生成一個無參數的實例構造函數。結構體中,無論是否顯示地定義了構造函數,隱式構造函數都是一直存在的。
- 結構體中不能顯示地定義無參數的構造函數。
- 在結構體的構造函數中,必須要為結構體中的所有欄位賦值。
- 創建結構體對象可以不實用new關鍵字,但此時結構體對象中的欄位是沒有初始值的;而類必須使用new關鍵字來創建對象。
- 結構體不能繼承結構或者類,但可以實現介面;而類可以繼承類但不能繼承結構,它也可以實現介面。
- 類是引用類型,而結構體是值類型。
- 結構體不能定義析構函數,而類可以有析構函數。
- 不能用abstract和sealed關鍵字修飾結構體,而類可以。
感覺這篇非常非常的基礎,我也是在想到底要不要寫,後來我決定還是寫下來。萬丈高樓平地起,加上技術更新也快,但有基礎,就可以以不變應萬變了。