C 程式設計思想及C 型別 運算子和強制型別轉換

2021-07-05 13:38:21 字數 2962 閱讀 8826

1)basetype過程式的程式設計缺陷:c#要注意記憶體資料值型別/引用型別,型別轉換錯誤。

2)crl oop物件導向泛型介面:泛型設計和介面設計特性理解crl補充的**自己要新增的**,il中間語言分析原理。

3)aop面向切面的程式設計需求特例,元程式設計,函式程式設計,資料程式設計:元程式設計和函式程式設計的風格,正規表示式,lambda表示式,linq程式設計。

4).net framework事件框架非同步程式設計機制, 元件外掛程式化微核心程式設計架構::委託的事件程式設計, 執行緒排程,非同步程式設計。

5)語言優缺點,底層互動和優化效能:物件申請釋放,記憶體管理特性,和c/c++語言的互動操作。

這裡講型別和型別轉換。

引用型別是類的例項(字串/陣列/所有的類物件),值型別是基本資料型別/結構體/或列舉的例項(

值型別初始化時候就會產生乙個對應的堆例項型別但是不使用,裝箱時候才填充使用)。

裝箱將值型別轉換為引用型別,例如轉換為string ,轉換為object。

拆箱只能拆之前裝箱過的,拆箱時候需要用()強制型別轉換,轉換後一定要確保拆後的棧型別大小能夠容納拆出來的型別,否則會報錯。

裝箱和拆箱時候內容都是拷貝過去的,所以裝箱後改變了型別的值就不會影響原來值。

對複雜型別用sizeof需要指定在不安全**中,*,->指標運算也要放置到不安全**區域中。

typeof返回特定型別的物件,在反射技術中很有用。

checked寫在**塊中用{}括起來的將做溢位檢查,預設是unchecked的。

編譯選項設定為/checked就可以檢查程式中所有未標記**的溢位。

checked溢位檢查不會對巢狀的**起作用,所以需要在真正表示式轉換的地方進行限定。

可空型別,可以用nullable宣告,也可以用?宣告,可空型別可以在於db/xml互動時候免去裝箱和拆箱提高效能:

?宣告為可空型別,可空型別參與的數**算都是null,邏輯運算為false。

??第乙個非空取第乙個,否則取第二個。

nullablex1;  

int ? x2;  

對可以宣告可空型別,操作時候:  

x1 = 10;  

x2 = x1;  

if(!x1.hasvalue)  

資料互動時候:  

非可空型別可以直接轉換為可空型別:  

int y1 = 4;  

int ? x1 = y1;  

可空型別轉換為不可空型別,可能會失敗,需要進行強制轉換:  

int ? x1 = getnullabletype();  

int y1 = (int)x1;  

或??宣告為合併符號,定義了預設值如果x1空那麼y1 = 0:  

int y1 = x1 ?? 0;

隱式型別轉換直接轉,基礎型別提公升,子類引用轉換為父類都是直接進行的,其中uint轉換為float等也算是隱式轉換安全的。

顯式型別轉換用在強制型別轉換中,用c風格的,不用c++風格的,型別提公升會隱式進行轉換,型別下降需要強制了型別轉換,強制型別轉換最好用checked符號限定避免出現異常。

基本型別轉換為字串用tostring函式,字串型別轉換為其它基本型別用parse函式。

object類的四個比較函式:

equalreference靜態引用比較不能重寫,指向相同的引用才會相等。

虛擬的equals方法,也是比較引用型別,如果要按值模擬較那麼需要重寫,資料結構的字典型別中作為鍵值的型別一定要重寫,否則會導致問題gethashcode會異常,其它.net基類也可能出現異常。

結構體中只是包含值型別.net做了處理,如果結構體中包含引用那麼也要重寫虛擬的equals方法,否則只是比較引用的位址。

靜態的equals方法,不能重寫,可以比較空值型別,兩個空則true,乙個空則fasle,都是引用型別會呼叫虛擬的equals方法。

==運算子,預設是比較引用,但是提供了介於值型別和引用型別之間的比較,而不是改變equals引用比較或值比較,.net string型別就過載了該運算子,用於比較字串內容。結構體==運算子比較會出錯,除非過載了該運算子。

運算子過載都是要public static的,表示屬於類的特性,不是例項的特性。

public static vector operator +(vector lhs, vector rhs)

+= -= *= /=等運算子c# il 會展開所以過載 + - * /運算子即可。

過載了==運算子,那麼也要過載!=運算子,也要過載object的equals和gethashcode函式,原因是==運算子和object的虛函式equals需要實現相同的邏輯,要分別寫因為==運算子先比較空值(il 中會先傳入null值比較),呼叫null.equals(b)就會導致錯誤。

1)自定義型別和基礎型別間的轉換:

轉換函式也是和操作符過載一樣public static的。

// 可以隱式轉換

public static implicit operator float(currency value)

// 需要顯式用()符號寫明

public static explicit operator currency(float value)

為了確保精度在實現四捨五入,而不是截斷的型別轉換,用system.convert型別進行轉換,例如:convert.touint16();

2)類結構層次間的轉換,子類物件轉換為父類是合法的,

父類物件轉換為子類需要在子類提供乙個傳入基類物件的建構函式。

如果是兄弟節點之間的轉換也是用乙個子類中父類物件作為傳入引數的建構函式即可。

is判斷 用於檢查型別是否是特定型別或者是特定型別的子類。

as轉換 是將引用型別進行顯式型別轉換,如果是指定型別或者是指定型別的子類那麼轉換成功會返回被轉換的型別,否則返回null。如果要

將子類當做父類用 用childobj as father即可。

3)自定義型別轉換總結:

不同資料型別盡量用相同的資料型別,結果格式化即可,不同的多種在轉換顯式的編寫轉換**,避免預設複雜的轉換路徑。

C 強制型別轉換運算子

將型別名作為強制型別轉換運算子的做法是c語言的老式做法,c 為保持相容而予以保留。c 引入了四種功能不同的強制型別轉換運算子 static cast reinterpret cast const cast和dynamic cast。強制型別轉換有一定的風險,有的轉換不一定安全,如把整型數值轉換成指標...

C 強制型別轉換運算子

c 將型別名作為強制型別轉換運算子。c 引入了四種功能不同的強制型別轉換運算子以進行強制型別轉換 static cast reinterpret cast const cast 和 dynamic cast。強制型別轉換是有一定風險的,有的轉換並不一定安全,如把整型數值轉換成指標,把基類指標轉換成派...

強制轉換運算子和型別強制轉換運算子

char b a cout int b endl 在 c 中,型別的名字 包括類的名字 本身也是一種運算子,即型別強制轉換運算子。型別強制轉換運算子是單目運算子,也可以被過載,但只能過載為成員函式,不能過載為全域性函式。經過適當過載後,型別名 物件這個對物件進行強制型別轉換的表示式就等價於物件.op...