方法、函數、過程、靜態變數、類、結構體、構造函數、析構函數、運算符重載、索引器、類型轉換重載、嵌套類型 ...
C#複習④
2016年6月16日
12:37
Main Classes and Structs 類和結構體
1.Contents of Classes
欄位,常量,方法,構造函數,析構函數;
特性,事件,索引器,重載運算符;
嵌套類型(類,介面,結構體,枚舉類型,委托)
2.Classes 類
棧類:數組、棧指針、構造函數、壓棧、出棧
類實例對象分配在堆上;
類對象必須通過new關鍵字實例化;
類可以繼承自其他類(C#不支持多繼承);
類可以實現多個介面(C#支持多個介面繼承)
3.Structs 結構體
點結構體:點坐標(x,y)、構造函數、MoveTo方法
結構體實例對象分配在棧上;
可以通過new關鍵字構造實例對象;
欄位在聲明時禁止初始化;
不能聲明無參構造函數;
不能繼承其他結構體或被繼承,但是可以實現多個介面
4.Visibility Modifiers 可見性修飾符
Public visible where the declaring namespace is known 在當前命名空間下可見
Private only visible in the declaring class or struct僅在類或結構體定義域內可見
類和結構體預設的欄位均為private,方法預設為public
5.Fields and Constants 欄位和常量
· 在類中,欄位在聲明時初始化是一個可選的(可以初始化,如果沒有初始化則編譯器會進行預設的初始化);
· 對於常量,在聲明時必須進行初始化,否則編譯時會報錯;
· Readonly 欄位必須在聲明時初始化或者在構造函數中進行初始化;數值咋編譯時期不可參與運算;數值在之後不可改變;占用記憶體空間
6.靜態欄位和常量
靜態欄位屬於類不屬於實例對象(在類沒有實例化任何對象時,靜態欄位已經產生,靜態欄位是這個類的固定屬性,可以被通過該類構造的所有對象共用)
常量不能夠聲明為靜態
static readonly需要註意的一個問題是,對於一個static readonly的Reference類型,只是被限定不能進行賦值(寫)操作而已。而對其成員的讀寫仍然是不受限制的。
推薦:http://www.c-sharpcorner.com/UploadFile/2072a9/constant-vs-readonly-vs-static-keywords-in-C-Sharp/
7.Methods 方法、函數、過程
方法:可能有返回值也可能沒有返回值
過程:沒有返回值
函數:有返回值
8.Static Methods 靜態方法
靜態方法實現對靜態欄位的處理
9.Parameters 參數
兩種傳參方式:值傳遞、引用傳遞
用Ref型參數時,傳入的參數必須先被初始化。而Out則不要要,對Out而言,就必須在方法中對其完成初始化。
用Ref和Out時都必須註意,在方法的參數和執行方法時,都要加Ref或Out關鍵字,以滿足匹配。
Out更適合用在要要Return多個返回值的地方,而Ref則用在要要被調出使用的方法修改調出使用者的引用的時候。
ref修飾符:參數可進可出
out修飾符:參數只出不進
10.Variable Number of Parameters 可變數組參數
C#語法規定,params後邊必定跟數組。
作用是把不定數量的、同類型的參數裝入這個數組中
string也是object的子類,所以可以用一個object[]數組代替string[]
11.Method Overloading 方法重載
方法重載:在一個類中兩個或者兩個以上的方法具有相同的函數名
並且滿足參數不同或者參數類型不同或者 不同參數定義(out/ref)成為方法的重載。
重載不要求函數返回類型不同,也就是說當兩個函數只有返回類型不同時不滿足重載的條件!
滿足條件的重載:
Illegal overloading:
12.Constructors for Classes 類的構造函數
類的構造函數有可見性修飾符,沒有返回值,且函數名與類名相同;
當聲明類時若不主動添加構造函數,則編譯時編譯器會自動添加一個預設的構造函數,並且這個構造函數無參。
當聲明一個類的時候手動添加了構造函數,那麼編譯器不再為該類添加無參構造函數,也就是之後在實例化對象時手動調用無參構造函數會報錯。
一個類可以有多個構造函數,這些構造函數沒有返回值,並且函數名相同。按照之前的重載定義,一個類中的所有構造函數互為重載函數
對於構造函數,可以選擇對欄位進行初始化。當未初始化時,預設的構造函數會按照下麵的規則進行對各個欄位的初始化。
13.Constructor for Structs 結構體的構造函數
結構體的構造函數有可見性修飾符,沒有返回值,構造函數名與結構體名相同;
對每一個結構體都會有一個預設的無參構造函數;
程式員不能為結構體創建一個帶參的構造函數;
結構體的構造函數必須初始化所有的欄位
14.Static Constructors 靜態構造函數
靜態構造函數必須是無參的,沒有可見性修飾符;
一個類或者結構體有且只能有一個靜態構造函數;
靜態構造函數用來初始化靜態欄位;
當該類型被第一次使用時,靜態構造函數立刻被調用
15.Destructors 析構函數
在一個實例對象被垃圾回收之前調用析構函數;
析構函數沒有可見性修飾符;
結構體沒有析構函數;
16.Indexers 索引器
索引器包括可見性修飾符、返回值、函數名、索引類型
17.Operator Overloading 運算符重載
運算符重載需要註意對某個運算符重載後要對其相應的另一個運算符重載。比如重載了加法運算符,相應的也要重載減法運算符;
可以被重載的運算符:
數學運算符:+、-、*、/、%、++、--
關係運算符:==、!=、<、>、<=、>=
位運算符:&、|、^
其他運算符:!、~、>>、<<、true、false
重載運算符必須返回一個函數值;
18.Conversion Operators 類型轉換重載
顯式類型轉換 Explicit conversion
隱式類型轉換 Implicit conversion
推薦:https://msdn.microsoft.com/en-us/library/09479473(v=VS.80).aspx
class SampleClass
{
public static explicit operator SampleClass(int i)
{
SampleClass temp = new SampleClass();
// code to convert from int to SampleClass...
return temp;
}
}
19.Nested Types嵌套類型
內部類可以訪問外部類的所有成員變數和成員函數;
外部類之能訪問內部類中可見性為public的成員變數和成員函數;
只有當內部類為public時,其他類才可以訪問;
訪問內部類需要通過外部類名加上點運算符 "."加上內部類名