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...