標籤:c# 物件導向 對象 類 編程
在看過C++之後,再看C#的物件導向感覺就不難了,只是有一些區別而已。
1、類定義
使用class關鍵字來聲明類,其和C++不同的地方是在大括弧之後不需要冒號
class 類名{ //類的內部} //C++這裡有一個冒號,而C#沒有
2、類成員
3、欄位與屬性
首先我們先區分一下C#資料成員中的欄位、常量與事件成員。欄位、常量是與類的相關變數。事件是類的成員,在發生某些行為時(如:改變類的欄位或屬性,或進行某種形式的使用者互動操作),它可以讓對象通知調用方。
那麼現在我們在來看看欄位與屬性,屬性的定義如下:
[存取權限] [類型] [屬性名稱]{ //get和set前訪問屬性預設為public get { return [該屬性對應的欄位]; } set { //作你想對該欄位進行的操作 }}
下面我們來看看,執行個體,順便瞭解一下get和set的原理
【C#】
class Test{ private int num; public int Num { public get { return num; } public set { num = value; } }}
【C++】
class Test{ private int num; public int getNum() { return num; } public void setNum(int value) { num = value; }}
不知道你發現了沒有,在C#中,將getNum這個函數做成了get,setNum做成了set,將set得到的值用value儲存。其實說白了,屬性就是可以對某一欄位進行讀取和賦值操作的方法。但是調用的時候就不需要方法名稱後的括弧。就以上面的代碼為例: Test.Num 。只要這樣就可以調用他了。
4、方法
其實這個和就是成員函數,不過在C#中成員函數的範圍更廣。現在我們來看看
<1>方法的定義
[訪問屬性] [傳回值類型] 方法名稱([參數]){ //方法內部實現}
舉個例子:
class Test{ private int a,b; public int Add() { return a + b; }}
<2>調用方法:
using System;namespace MyFirstProgram{ class Program { class Test { private int a,b; public int Add() { return a + b; } } static void Main() { Test p = new Test(); p.Add(); //對方法的調用 } }}
<3>給方法傳遞參數
這個就和普通的函數傳遞參數是一樣的。在C#中,特別注意,除非特別聲明,否則參考型別均為引用傳遞,值類型均為值傳遞。
<4>選擇性參數
其實這個就是C++中的預設值
<5> ref 與 out 參數
值傳遞的類型是預設的,但是有些時候我們需要對他進行改變。這時就出現了 ref 與 out。
public void Add(ref int b){ b++;}
調用時還需要添加ref關鍵字
p.Add(ref i);
其實這就和C++中的引用機制一樣,不同的是,在C#中 ref 必須 要使用賦過值的變數。然而out為首碼時,變數可以不初始化。
特別注意:ref 與 out 的 參數不能帶有預設值:
public void Add(ref int b = 2) //錯誤,對其進行預設值,所以不能用ref或out{ b++;}
<6>無序傳遞
這個機制,在C++中沒有。不過覺得貌似也沒什麼用
//函數string setName(string FName,string LName){ return FName + " " + LName;}//正常調用setName("John","Doe");//無序調用setName(LName: "Doe", FName: "John");
兩種調用得到的結果是一致的。
5、建構函式
建構函式是在建立對象時,對對象資料初始化的方法。其方法名稱與類名相同,且沒有傳回型別。如果沒有寫的話,編譯器會自動建立一個無參建構函式,將所有的資料初始化為標準的預設值。
class Test{ //只要建立了無參建構函式,後台將不會自動產生建構函式 public Test() { //建構函式實現 } //重寫建構函式 public Test(int Number) { //建構函式內部實現 }}
C#還有一個特性是可以給類編寫無參數的建構函式,編寫靜態建構函式的原因就是,類內部有一些靜態欄位和屬性,需要在第一次使用類之前初始化。注意:靜態建構函式至多隻運行一次。
6、匿名型別
由關鍵字var聲明,其隱式類型化的變數。其實我覺得這個就相當於一個沒有名稱的類一樣。這個感覺並不好用,所以還是慎用。聲明如下:
如果一個對象包含一個人的姓名。
var person = new { FirstName = "John", LastName = "Doe" };
7、部分類
使用 partial 關鍵字可以將類、結構方法或借口放在多個檔案中,通常一個類在一個檔案中,但是在多人開發的時候就可以體現出partial的威力了。
8、弱引用
這個機制,是為了節約記憶體。因為當程式執行個體化一個類或結構時,只要有代碼引用就會,形成強引用(相對弱引用而言)。如果這個類十分巨大,且不經常訪問。那麼就會浪費大量的記憶體,所以就引入了弱引用的概念。弱引用是使用WeakReference 類建立的。因為對象隨時可能被回收所以在引用該對象時必須先確認它的存在。
static void Main(){ WeakReference TestReference = new WeakReference(new Test()); Test tmp; //IsAlive這個屬性的目的就是TestReference的對象被回收了沒有 if (TestReference.IsAlive) { //如果類對象存在,那就引用該對象 tmp = TestReference.Target as Test; }}
9、靜態類
靜態類的內部只用靜態方法和屬性。靜態類在功能上與 使用私人靜態建構函式建立的類相同。注意:靜態類不能建立執行個體。
反之我們可以使用static關鍵字檢查是否建立了該類的執行個體,如果是編譯器就會報錯。
10、類(class)與結構(struct)的區別
①類可以繼承,然而結構不能
②類儲存在託管堆上,然而結構儲存在棧上(所以結構儲存效率優於類)
③類是參考型別,而結構是值類型
④原則結構的預設無參建構函式不可替換,但是如果將無參建構函式重寫是對全體資料成員進行賦值的話,那麼就可以重寫
11、唯讀欄位與常量的區別
唯讀屬性有readonly聲明。常量概念就是包含一個不可修改的變數。但是有時候需要一些變數其值不能改變,但運行之前是未知的。所以我們就引入了唯讀屬性。唯讀屬性比const靈活很多,readonly可以再建構函式中給其賦值,所以說每個執行個體都可以有不同的值。
12、typeof的使用
typeof可以擷取物件類型,
Type t = typeof(int);Console.WriteLine(t.Name);
這樣的話就會輸出Int32
13、using的使用
在C#中using就和C++的typedef一樣:
using Print = System.Console;namespace MyFirstProgram{ class Program { static void Main() { Print.WriteLine("Hello world!"); } }}
第三章的內容差不多就是這樣
《C#進階編程》【第三章】對象和類型 -- 學習筆記