1. 程式人生 > >C#第三章 物件和型別

C#第三章 物件和型別

第三章物件和型別

1.類和結構的區別:

a.最大的區別是儲存位置不一樣:類是引用型別,存放在堆上,結構式值型別,存放在堆疊上。所以new運算子與類的工作方式不同,不分配記憶體,只是呼叫建構函式,初始化欄位

b.結構不支援繼承

c.結構不允許定義無引數建構函式,不能給欄位提供初始值

2.類成員

類中的資料(欄位、常量、事件)和函式(方法、屬性、建構函式和終結器、運算子以及索引器)稱為類的成員

(1)ref引數迫使引數通過引用傳送給方法帶入前初始化

(2)out輸出引數引數前加out關鍵字時,傳遞給該方法的變數可以不初始化

static void Main(string[] args)

{

//ref

關鍵字

//int[] ints = {10};

//int i = 10;

//SomeFunction(ints,ref i);

//Console.WriteLine(ints[0].ToString()+i.ToString());

//out關鍵字

int i;

SomeFunction2(out i);

Console.WriteLine(i);

}

///<summary>

/// ref

///</summary>

///<param name="ints"></param>

///<param name="i"></param>

static void SomeFunction(int

[] ints, ref int i)

{

ints[0] = 100;

i = 100;

}

///<summary>

/// out

///</summary>

///<param name="i"></param>

static void SomeFunction2(out int i)

{

i = 100;

}

(3)方法過載方法中的引數名稱、引數型別或引數個數不同

a.兩個方法不能僅在返回型別上有區別

b.兩個方法不能僅根據引數是宣告為ref還是out來區分

(4)建構函式

C#中預設有一個沒有引數沒有返回值的建構函式

把建構函式定義為privateprotected,不相關的類就不能訪問

public class MyNumber

{

private int number;

private MyNumber(int number)

{

this.number = number;

}

}

在這個例子中,我們沒有為MyNumber定義任何公共或受保護的建構函式。所以MyNumber類不能使用new運算子在外部程式碼中例項化(但可以在MyNumber上編寫一個公共靜態屬性或方法,已進行例項化),適用於以下兩種情況:

類僅用作某些靜態成員或屬性的容器,因此永遠不會例項化

希望類僅通過呼叫某個靜態成員函式來例項化

a.靜態建構函式沒有訪問修飾符,不能帶任何引數,一個類只能有一個靜態建構函式,顯然,靜態建構函式只能訪問靜態成員

(5)只讀欄位

public class DocumentEditor

{

public readonly DateTime CreationDate;

public DocumentEditor()

{

CreationDate = new DateTime(2002,1,1);

}

}

把欄位宣告為只讀型別,表示其值只能在建構函式中設定

3.結構與類的區別

結構是值型別,不是引用型別。他們儲存在堆疊中火儲存為內聯(如果他們是物件的一部分,就會儲存在堆中),其生存期的限制與簡單的資料型別一致

結構不支援繼承

結構的建構函式的工作方式有一些區別。尤其是編譯器總提供一個無引數的建構函式,這是不允許替換的

使用結構,可以指定欄位如何在記憶體中佈局

4.部門類(partial

Partial關鍵字允許把類、結構或介面放在多個檔案中。如果沒有類的原始碼時,可以使用部分類給其新增內容

//BigClassPart1.cs

partialclass TheBigClass

{

public void MethodOne()

{

Console.WriteLine("one");

}

}

//BigClassPart2.cs

partialclass TheBigClass

{

public void MethodTwo()

{

Console.WriteLine("two");

}

}

5.靜態類(static)

如果一個類只包含靜態的方法和屬性,該類就可以是靜態的。靜態類不能建立例項。條用靜態類中的方法:類名.方法名