C 學習筆記6

2022-04-03 20:20:09 字數 2637 閱讀 6887

1.結構:結構除了可以含有屬性和字段,還可以包方法和構造器,但不能包含黠認(無引數}的構造器。有的時候(比如在例項化乙個陣列的時候)不會呼叫值型別的構造器,因為所有陣列記憶體都轉為用零來初始化,為了避免因為預設構造器只是偶爾呼叫而造成不一致,c#完全禁止了使用者顯式定義預設構造器,因為編譯器會將宣告時的例項字段賦值放到型別的構造器中進行。在構造器中必須對 struct中的所有字段進行初始化,如果沒有做到這一點,就會產生編譯錯誤,可檢視angle結構的**。

2.結構的繼承與介面:所有值型別都是密封的,除此之外,所有值型別都派生自system.valuetype,這意味著struct的繼承鏈息是從object到valuetype到struct。值型別還能實現介面,許多介面都是實現介面框架固定組成部分,比如 icomparilble 和iformattable。

3.裝箱與拆箱:裝箱就是把值型別變成引用型別,如下:

(1) 首先在堆中分配好記憶體,它將用於存放值型別的資料以及少許額外開銷;

(2) 接著發生一次記憶體複製動作,棧上的值型別資料複製到堆上分配好的位置;

(3) 最後,物件或介面引用得到更新,指向堆上的位置;

拆箱就是把引用型別變成值型別,如下:根據定義,cil 指令 unbox 只是對堆上的資料進行解引用,並不包括從堆複製到棧的動作。但在 c#語言中,太多數時候緊接著在拆箱之後發生一次複製動作。裝箱和拆箱之所以重要,是因為裝箱去對效能和行為造成一些影響。開發者可以通過檢視cil,在乙個特定的**片段中統計 box/unbox 指令的數量。在boxandunbox()中的**就存在多次的裝箱與拆箱,這樣編寫的**是不合理。

4.列舉:列舉和其他值型別稍有不同,因為列舉的繼承鏈是從system.valuetype到system.enum,再到enum。

5.列舉與字串的轉換:列舉tostring()後會輸出列舉識別符號,使用enum.parse或enum.tryparse方法可以把字串轉化為列舉,後乙個方法是.net4.0新增的泛型方法。此中我們也可以使用enum.isdefined()方法來檢查乙個值是否包含在乙個列舉中。

6.列舉作為「位標誌」使用:

(1)可以檢視如下「fileattributes「列舉的設定(即system.io。fileattributes的設定),作為位標誌後,其值可以自由組合,所以可以使用or運算子來聯結列舉值。如本示例中bitflag()方法的使用。當然列舉中的每個值不一定只對應乙個標誌,完全可以為常用的標誌組合定義額外的列舉值。

(2)使用位標誌型別的時候,位標誌列舉應該包含[flagsattribute]這個特性,這個標誌指出多個列舉值可以組合使用,此外,它改變了tostring()和parse()方法的行為。例如為乙個已用flagsattribute修飾了的列舉呼叫tostring()方法,會為已設定的每個列舉標誌輸出對應的字串(如bitflag2()的示例),而如果沒有這個修飾,返回的就是組合後數值。

public

struct

angle

public

int hours

public

int minutes

public

int seconds

public angle move(int hours, int minutes, int

seconds)

}[flags]

public

enum

fileattributes

public

void

bitflag()

| =

", fileattributes.hidden, fileattributes.readonly, (int

)file.attributes);

if ((file.attributes & fileattributes.hidden) !=fileattributes.hidden)

if ((file.attributes & fileattributes.readonly) !=fileattributes.readonly)

//....

}public

void

bitflag2()

\" output as \"\"

", file.attributes.tostring().replace("

,", "|"

), file.attributes);

fileattributes attributes;

enum.tryparse(file.attributes.tostring(),

outattributes);

console.writeline(attributes);

file.setattributes(filename, startingattributes);

file.delete();

}public

void

boxandunbox()

foreach (double num in

list)

,", num);

}}

----------------------以上內容根據《c#本質論 第三版》進行整理

C 學習筆記 6

通常,由於 c 風格字串與字串字面值具有相同的資料型別,而且都是以空字元 null 結束,因此可以把 c 風格字串用在任何可以使用字串字面值的地方 可以使用 c 風格字串對 string 物件進行初始化或賦值。string 型別的加法操作需要兩個運算元,可以使用 c 風格字串作為其中的乙個運算元,也...

C語言學習筆記6

最開始學習的時候從最簡單的程式設計開始學習,那麼我們都會看一些關於 c語言基礎書籍 把基礎打好之後我們會慢慢的看一些 c語言提高書籍 那麼接下來我們就繼續進行打基礎的工作。1 啟動vc 編譯系統 單擊 file 選單中 new 命令,進入vc 編譯系統介面,選擇 files 選項卡,選擇c 原始檔命...

C語言學習筆記6

魯迅先生曾說過,偉大的成績和辛勤勞動是成正比例的,有一分勞動就有一分收穫,日積月累,從少到多,奇蹟就可以創造出來。學習也是同等道理,日積月累,逐漸儲備知識就可以完成自己的理想。然而看 c語言程式設計教程 是儲備知識的乙個方法,所以現在就來看看我要學習的知識內容。if語句是大型程式使用最多的結構,不管...