這節講C#中的類,方法,屬性。這是編碼中我們最直接打交道的三個結構。
類:
類(class)是面向對象中最基本的單元,它是一種抽象,對現實世界中事物的抽象,在C#中使用class關鍵字聲明一個類:
class MyClass{}
類既然是一個抽象,我們使用的時候就要對其進行實例化,通過new關鍵字實例化一個類。
MyClass myclass=new MyClass();
在實例化的同時,我們還可以通過對象初始化器,對類中的屬性進行操作。
MyClass myclass=new MyClass(){屬性名=屬性值}
這對大括號就是對象初始化器,使用對象初始化器,如果使用的構造方法是無參的,那么初始化器之前的小括號可以省略。
每個類都有一個構造方法(constructor),構造方法的名字必須跟類名一致(我們實例類的時候就是調用的這個方法),如果不顯式聲明類的構造方法,系統就會默認生成一個無參的構造方法。
class MyClass{ public MyClass(){}//構造方法 }
我們可以通過構造方法為類中的成員進行初始化,這其實也是構造方法的很重要的用途。
class MyClass{ public bool isReal; public MyClass(bool isreal){ this.isReal=isreal; }//構造方法 }
以上代碼中出現了一個關鍵字this,this是指當前對象,只能用在類的內部,以上代碼的意思是這個對象的IsReal屬性=isreal。
需要注意的是,在執行類的構造方法之前,會先執行其父類的無參的構造方法,或者,我們指定父類的有參的構造,因為子類繼承了父類,在實例化子類的時候,必定要將繼承自父類的成員也在內存中創建出來,注意,這並非是實例化父類。
//使用上一節的代碼做演示 public class Husky : Dog { public Husky() : base("Husky"){}//訪問父類的有參構造,初始化屬性 }
除了定義一般的類,我們還可以定義靜態類,使用static class 聲明一個靜態類,類中的屬性和方法也必須都是靜態的。
static class stClass{}
靜態類在內存中只有一份,它不需要實例化,在程序的一開始就自動加載,一般靜態類都是作為工具類,拿來即用的。調用靜態方法,可以使用靜態類名.方法名的形式,也可以使用using引入靜態類名,就可以省略靜態類名,直接調用方法名。
另外,類是可以嵌套的。嵌套的類的作用域就縮小到了外部類的作用域中。
方法:
方法聲明在類的內部,它定義了類的行為,聲明一個方法,需要三個必要元素:返回值,方法名,方法參數:
void MyMethod(){}//無參,無返回值的方法 int MyMethodWithOneRetutn(){return 0;}//無參,返回值為int int MyMethodWithOneArgOneRet(int a){return a+a;}//一個參數,一個返回值
如果一個方法沒有返回值,那么它的返回類型就是void,多個參數之間用逗號隔開。方法還有一些前綴,比如訪問修飾符,靜態修飾符,重寫關鍵字等等。修飾符默認的是private。
方法是可以重載的,所謂重載,就是一個類中可以存在相同方法名的方法,C#中,方法名和參數列表組成一個方法簽名,重載一個方法,只需要修改方法簽名中的參數列表即可。以下是一組重載方法:
public void RelodeOne(int a){} public void RelodeOne(int a, int b){}
方法的重載,使一個行為,可以有不同的動作,或者說擴展了一個行為的覆蓋面。就好比吃飯(方法名),一個人(一個參數)是吃飯,兩個人(兩個參數)也是吃飯,行為是一樣的,但不同的人數吃飯, 做的菜多少也不一樣。
編譯器會根據傳參的不同調用不同的重載方法。
關於方法,還有一個知識點,叫方法的重寫,它跟繼承有關,如果想重寫父類的方法,那么父類的方法,就要設置為virtual也就是虛方法,子類重寫,需要使用關鍵字override。如果父類不寫virtual,子類在重寫時需要加上new關鍵字,下面演示這兩種情況:
class OverFather { public virtual void isvirtual() { Console.WriteLine("我是父類虛方法"); } public virtual void isold() { Console.WriteLine("我是父類老方法"); } } class OverWirteMethods : OverFather { public void isvirtual() { Console.WriteLine("我是子類真方法"); } public new void isold() { Console.WriteLine("我是子類新方法"); } }
在主方法中調用:
OverWirteMethods o = new OverWirteMethods(); o.isvirtual(); o.isold();
屬性:
一個類中,除了方法還有屬性,方法用來執行動作,屬性用來保存數據。屬性是個封裝結構,它是對外開放的,類中還有一種私有結構,叫字段,屬性就像是一個外殼,包裹着字段,不受非法數據的污染。
將一個變量設置為私有的,就可將其稱之為字段,然后聲明一個屬性,來訪問和修改這個字段。屬性通過get,set塊來獲取和修改數據。
下面看一個演示:
private bool isFiled;//聲明一個字段 public bool IsFiled//聲明一個屬性 { get { return isFiled; }//使用get塊獲取到字段的值 set { value = isFiled; }//使用set塊設置字段的值 value是賦過來的值 }
在get,set塊中就可以寫一些邏輯,處理數據。如果省略其一,就形成了只讀或者只寫屬性。
另外,C#5推出了一個新的語法糖:自動屬性:以上代碼就可以變化為這樣:
public bool IsFiled{get;set;}
自動屬性無法對數據做處理,只負責獲取或修改,但可以將get或set塊設置為私有的,或者也可以不寫,自我感覺自動屬性就是為了少寫代碼,沒啥特殊的。
個人公眾號,熱愛分享,知識無價。