靜態類和非靜態類:
靜態類(靜態屬性等)是類所有的,非靜態類為類的例項所有的。
靜態類是類的所有例項所共享的,無論此類建立了多少例項,靜態類在記憶體中都只開闢了一塊儲存空間。
const常量也可以看成這種型別:
public class myclass
呼叫時可以直接myclass.kiss_my_class
類的宣告型別:
protected: 可以在派生的子類中訪問的
internal:只有其所在類才可以訪問(?)
abstract:不允許直接被例項化的類
sealed:不允許被繼承的類
方法的宣告型別:
virtual:抽象類裡必須的虛擬方法,以此來表明此類為乙個抽象類
sealed:不允許被繼承的方法
override:多型的一種,覆蓋,可以在直接使用父類的該方法base.***(e)的前提下,擴充套件自己的方法.
abstract:簡單的定義乙個型別,需要派生類具體來實現的抽象方法
extern:簡單的定義乙個型別
方法的引數型別:
值參:以此方法傳遞引數的,會copy乙份相同值傳入方法內部
引用參:ref int param1 直接將傳遞引數的實際值的位址傳入方法,而不會開闢新的儲存空間。param1需要被初始化
輸出參:out int param2 與ref不同的是,param2不需要被初始化,其它與ref相同
陣列參:params int param3 陣列參必須位於引數列表的最後,記憶體中為引數的最未開闢了乙個可變化的陣列儲存空間,此類引數不允許再帶有ref,out
過載:方法名相同,返回型別相同,而引數不同(個數或型別)的多個方法
操作符過載:
操作符過載的需求起於對不同型別的相加的功能擴充套件,給操作符定義以新的含義,在特定的類上做新的栓釋,比如傳入字串,則進行字串的相加,這和常規的僅限於整型的+是不同的,當然此類需求也可以擴充套件到業務類的相加。
可被過載的操作符為:
+ - * % / ++ --
true false
<< >> == != > < >= <=
! & | ^ ~
過載的方法(比如洛奇公升一級的加點,player為洛奇的玩家物件,我們用過載++來實現公升級的新含義)
public static player operator ++ (player _p)
再比如笛卡爾加法:
public static dkr operator + (dkr d1, dkr d2)
實現了這種類的相加:) 很好用吧。可以大大擴充套件我們的常規思維方法。
readonly:唯讀域只能夠在建構函式中進行修改
public static readonly string kiss_my_class = "oh, please kiss the class.";
public const string kiss_my_class = "oh, please kiss the class.";
以上兩句可以起到相同的效果
不同的是,const的表示式的值是在編譯時生成,而static readonly是在程式執行了之後才會被載入在記憶體中的。
所以在另乙個專案引用此dll時,如果kiss_my_class修改後,必須重新編譯此dll,才能得到新的常量,而如果為static readonly,則不用編譯即可以得到修改過的常量值。
事件:event
我們需要在button的過載中定義乙個事件的類ondoubleclick()
1. 首先需要宣告乙個eventhandler的委託類(和abstract類似,只需要宣告,不需要實現)
public delegate void eventhandler(object sender,eventargs e);//定義乙個委託的型別,event為eventhandler
public class button: control}}
索引器:
string _name = string[8];
public string this[int index]
set}
繼承:c#中的繼承規則.
1. 繼承可傳遞
2. 派生類應當是對基類的擴充套件
3. 建構函式與析構函式不能被繼承
4. 派生類如果定義了基類的同名成員,則基類的這些成員不能再被訪問
5. 派生類可以過載基類的虛方法,虛屬性和虛索引器,表現為多型
多型性:polymorphi**
同一操作對應不同的物件,有不同的解釋產生不同的結果。多型性可以通過過載基類中的虛函式型方法來實現。
過載虛方法,須使用override宣告型別,而不能有static,virtual,new的修飾符
抽象類:
抽象類為它的派生類提供了乙個公共的"介面",
抽象類的派生類若要實現它父類的方法,則必須使用override來進行覆蓋過載,抽象類與介面不同的是它還可以使用非抽象方法,即派生類override它的時候能使用base.***();來加入原型的成員,但如果是抽象方法則不能使用base來進行訪問。
抽象方法為抽象類中可以被其派生類過載的「介面」
如果在派生類中使用 public abstract override void func();
虛方法和抽象方法的區別:
抽象方法是沒有實際方法的介面函式,即只給子類提供了方法定義,需要子類進行實現,而虛方法可以有自己的實現;
實現虛方法時,直接public override void func(),且裡面可以用base.***()來載入原虛方法的內容,抽象類則不能。
抽象類一定要有乙個虛方法,而不需要有抽象方法.
今天又讀了一本"visual c#.net 技術內幕"的第一部分,有幾點對昨天的"
物件導向的筆記
"有意義的補充,現列出如下:
1. 常量:
數量的值僅可在編譯時指定,平時不允許更改,常量並不占用物件的空間,而被編譯到需要該常量的可執行**中。故無法對const前加static的修飾符,它們實際上並不與任何具體的物件有關聯。
2. 建構函式:
建構函式寢值設定項不能訪問this指標,因為此時this物件還沒有建立好.
初始化的順序:
a. 初始化全部靜態字段;
b. 呼叫靜態建構函式
c. 初始化全部例項字段
d. 呼叫例項建構函式
故需要先對靜態的字段進行賦值
internal的訪問級別表示僅可訪問封裝該成員的程式集內部的類
4. 強制型別轉換:
type1 type2 _m = (type2)_m;
在將子類賦給基類引用時,不需要進行強制型別轉換,因為子類總是可以取代基類,但相反的過程不成立 -> 即ztegir繼承了datagrid,則_zgr可以強制轉換為datagrid,但相反則不可以。(當然不可以 - -!誰知道老爸有多少個兒子呢)
除了這種強制轉換,還可以as關鍵字,可以嘗試性的進行型別轉換而不會引發型別轉換的異常(invalidcastexception),如:
ztegrid _zgr; //ztegrid繼承datagrid
datagrid _dgr = _zgr as datagrid;
//但是其後必須(是必須)判斷_dgr被轉換的物件是否為null,因為as關鍵字即使轉換失敗也不會引發異常,而只是賦予引用乙個null,從而可以根據程式來進行捕獲
if (_dgr != null)
5. 結構: struct
結構是一種聚合型別,它將多個不同型別的成員組合為一種新的型別。
1). 結構不能被繼承,不能繼承類和其它結構,但它可以繼承介面;
2). 與類的例項不同的是,永遠不會在堆中為結構的例項分配記憶體空間,它們是從堆疊分配記憶體的。(?堆是何概念? 與堆疊有啥區別)
3). 結構也能有成員函式與建構函式,但注意:結構的建構函式必須包含至少乙個引數
4). 結構不允許宣告析構函式
6. 列舉:可以避免未強型別的錯誤,我們可以將session,許可權串,型別等寫在列舉類裡,用color.red這樣來進行強型別取值。是一種良好的程式設計習慣。
列舉項的值是基於int的,且預設從0開始,我們也可以用指定第乙個項的值來指定列舉值的開始邊界.
7. 獲取型別資訊:
is: 檢測是否為指定,返回boolean常量 > if (obj is datagrid){}
typeof: 檢測型別資訊,返回system.type物件 > datagrid _grid = typeof(datagrid);
sizeof: 檢測值型別的大小,引用型別的大小無法測定(因其相當於乙個函式指標) > int size = sizeof(datagrid);
8. 運算子過載:須成對進行過載,比如你過載了 ==和!= 但沒過載object.equals和object.gethashcode方法,編譯器會報警告。
object.equals用來檢驗引用是否相等(注意會檢驗引用喔!而不只是值的相等性)
object.gethashcode()是乙個雜湊運算子組,它能使雜湊表和其他類似的集合資料型別正確分配。雜湊函式用於快速生成乙個與物件的值相對應的數字(hashcode)
讀書筆記 物件導向
看了譚云傑老師的 thinking in uml 一書,前面講解了物件導向的內容,特此編寫一下讀書筆記。封裝 繼承 多型 構造乙個更大更複雜的系統 復用 可拓展性增強 利於分工協作 更能專注某個功能點研究,需要考慮的資訊量大大減少。現實世界如何對映到乙個物件世界?物件世界如何描述現實世界?如何驗證物...
譚浩強 《C 物件導向》讀書筆記1
私有資料只能被本類中的成員函式呼叫,不能被除友元類之外的其他類呼叫。在宣告乙個引用型別變數時,必須同時使之初始化。引用型別變數始終與其代表的變數相聯絡,不能再作為其他變數的引用 別名 在對表示式 常量 不同型別引用時,必須用const 作宣告。int i 5 const a i 3 double d...
讀書筆記9 物件導向設計原則
單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因。職責即為 變化的原因 開放封閉原則 軟體實體 類 模組 函式等 應該是可以擴充套件的,但是不可修改。對於擴充套件是開放的,對於更改是封閉的。關鍵是抽象,將乙個功能的通用部分和實現細節部分清晰的分離開來。理氏替換原則 子型別必須能替換掉他們的基...