說說C 的型別轉換

2022-01-31 20:14:50 字數 2671 閱讀 9175

c#

是 一門強型別的語言。大家都寫過很多以system.object型別為引數的函式,在這些函式內部,我們經常要吧那些引數向下轉型為其他型別。對於 這種轉型我們通常用兩種選擇:使用as操作符,或者使用強制轉型。當然還有乙個做法是先用is測試轉換是否可行,然後再用as或者強制轉換。

本文主要給大家提醒一些使用轉型時需要注意的地方, 或許你更想弄清楚as和強制轉換的區別和使用場景,不用著急,看完,本文你自己就知道答案了,那麼上面提到的兩種轉型我們需要注意哪些呢?

1、as和is操作符都不執行任何使用者自定義的轉換。

2、對於強制轉換,引用為空將會轉換出錯。

3、強制轉換任意型別和自定義轉換兩種情況的il**展示有區別。

4、使用者自定義轉換只作用於物件的編譯時型別。

5、as操作符不能應用於值型別。

6、foreach迴圈語句中使用強制型別轉型。

下面我們逐一進行介紹說明:

1, 我們先來看錯誤**示例:

class

aclassc}

class

program

}**已經很明顯,我們不可以因為定義了c到a的強制轉換,就使用as,對應使用者自定義轉換,我們只可以使用(a)o轉換,其實自定義轉換和自定義操作=、+、-、"、%等操作符是一樣的機理,這樣你就明白為什麼用as不可以使用自定義轉換了。

2,還是看乙個錯誤示例:

class

aclass

b : a

class

program

}問題不用多言,as可以解決這個問題。

3,看乙個示例:

class

aclassc}

class

b : a

class

program

}對於 b b = (b)a;的il**如下:

對於a = (a)c;的il**如下:

il_0015:  call       

class

class

區別大家已經看到了,要說真正認識區別那麼我們要繼續談「4、使用者自定義轉換只作用於物件的編譯時型別。"

4,看乙個示例:

class

aclassc}

class

b : a

class

program

}也許你從來沒想過a 

=(a)c;編譯會成功,執行會出錯在這句,畢竟我們有乙個顯示型別c到型別a的轉換操作,我們看看il**即可找到答案,

.method 

private

hidebysig 

static

void

main(

string

args) cil managed //

end of method program::main

il_0015:  call       

class

class

因為object

c,c被定義為object型別,那麼強制轉換在編譯時刻去object找是否存在自定義轉換操作(注意,()轉型時編譯器優先考慮自定義轉換,找不到才進行

castclass

),當然object沒有自定義轉換為a的操作,那麼就使用普通的強制轉換

castclass。好了現在我們知道了使用者自定義轉換只作用於物件的編譯時型別,而普通的b b 

=(b)a;強制轉換可以作用到執行時刻。那麼上面的錯誤如何去掉呢?對應**修改為:

objectc =

newc();

c cc =c 

asc;a =

(a)cc;

現在執行正常通過,好了我們再次檢視il**

il_001c:  call       

class

class

到這大家對3和4點的認識應該很清楚了吧。

5、as操作符不能應用於值型別————省略!,鑑於這個點很簡單,本人就不提供示例了,大家有興趣可以自己試驗下。

6、看**示例:(以下**摘自《effective c#中文版 改善c#程式的50中方法》——23頁)

public

void

usecollection (ienumerable thecollection)

//上面**等同於:

public

void

usecollection (ienumerable thecollection)

}通過檢視il**我們可以確認foreach語句的轉換是使用的強制轉換操作,那麼為什麼呢?之所以使用強制轉型,是因為foreach語句需要同時支援值型別和引用型別,這側面說明我們的第5點as不支援值型別。

好了,5點說明已經解釋完了,你現在還想問as和強制轉換的區別和使用場景麼?,歡迎提出批評、指正錯誤。

另外祝大家情人節快樂!當然沒有情人的不用

太,更不要和哥們

。love

baobao

出處:本文版權歸作者和共有,歡迎**,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。

mysql型別轉換c 型別轉換 C 型別轉換

一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...

C 的型別轉換

2008 03 15 12 59 強制型別轉換容易引發錯誤,所以被認為是一種醜陋的語法。c 中有乙個觀念 醜陋的語法就應該用醜陋的方式表達。所以,c 的轉換操作符使用 x cast 這種一種繁瑣的形式。目的是為了讓你在使用型別轉換前三思而行,看看是不是又不需要型別轉換的方法或設計。更重要的是,c風格...

C 型別的轉換

型別的轉換c 中型別轉換 顯隱 的機制分為兩種 一 隱式轉換 implicit conversions 二 顯式轉換 explict conversions 隱式轉換不需要指明欲轉變的型別 顯式轉換明確地使用轉換運算子 cast 指定要轉換成哪一種型別。c 允許程式設計師如果對於溢位進行處理 che...