C#的类型安全
類型安全應(yīng)該算是CLR最重要的特性之一了,在運(yùn)行時(shí),CLR總是知道一個(gè)對(duì)象的類型。在C#中可以調(diào)用GetType()來(lái)返回調(diào)用對(duì)象的類型,并且由于GetType()繼承于System.Object對(duì)象,并且為非虛的方法,所以一個(gè)類型不可能通過(guò)重寫此方法而偽裝成另一種類型。
由于在開發(fā)的過(guò)程中,經(jīng)常會(huì)需要將一個(gè)對(duì)象從一種類型轉(zhuǎn)換為其他的類型,所以CLR允許將一個(gè)對(duì)象強(qiáng)制轉(zhuǎn)換成它本身所引用的類型或派生其的基類型。一個(gè)對(duì)象向其父類的轉(zhuǎn)換CLR認(rèn)為是一種安全的隱式轉(zhuǎn)換,不需要任何特殊的然而需要將一個(gè)對(duì)象轉(zhuǎn)換為其派生類型時(shí),則需要進(jìn)行顯示的轉(zhuǎn)換,因?yàn)檫@樣的轉(zhuǎn)換可能在運(yùn)行時(shí)失敗。
下面來(lái)看一個(gè)例子:
?1namespace?LearnProject?{
?2????class?Program?{
?3????????
?4????????static?void?Main(string[]?args)
?5????????{
?6????????????//此類型轉(zhuǎn)換不需要顯示的進(jìn)行,因?yàn)閚ew返回的對(duì)象類型為Student
?7????????????//Person是Student的基類
?8????????????Person?student?=?new?Student();
?9????????????student.Eat();
10????????????//虛方法Work()在子類Student中被重寫?[多態(tài)的應(yīng)用]
11????????????student.Work();
12????????????//使用Object類型的變量去保存Student對(duì)象的引用依然不需要進(jìn)行任何顯示的轉(zhuǎn)換
13????????????//任何類型均是由System.Object派生而來(lái)
14????????????Object?objStudent?=?new?Student();
15
16????????????//將Object類型objStudent轉(zhuǎn)換成其派生類型Student則需要強(qiáng)制類型轉(zhuǎn)換
17????????????Student?studentObj?=?(Student)objStudent;
18
19????????????Program?p?=?new?Program();
20????????????//編譯器會(huì)自動(dòng)檢測(cè)將要進(jìn)行強(qiáng)制類型轉(zhuǎn)換的對(duì)象是否為目標(biāo)類型的基類或者派生類型,如果不是則在編譯期出現(xiàn)錯(cuò)誤
21????????????Student?studentProgram?=?(Student)p;
22
23????????????//然而此用顯式的轉(zhuǎn)換則能夠正常通過(guò)編輯,但是會(huì)在運(yùn)行時(shí)拋出一個(gè)InvalidCastException異常
24????????????Object?obj?=?new?Program();
25????????????Student?studentObj2?=?(Student)obj;
26????????}
27????}
28}
?1??public?class?Person
?2?????{
?3?????????public?void?Eat()
?4?????????{
?5?????????????Console.WriteLine("吃飯");
?6?????????}
?7?????????public?virtual?void?Work()
?8?????????{
?9?????????????Console.WriteLine("工作");
10?????????}
11?????}
12?????public?class?Teacher?:?Person
13?????{
14?????????public?override?void?Work()
15?????????{
16?????????????Console.WriteLine("教書");
17?????????}
18?????}
19?????public?class?Student?:?Person
20?????{
21?????????public?override?void?Work()
22?????????{
23?????????????Console.WriteLine("沒(méi)有工作,需要上學(xué)");
24?????????}
25?????}
轉(zhuǎn)載于:https://www.cnblogs.com/zuking/p/3947401.html
總結(jié)
- 上一篇: Python 学习笔记(2) - 基本概
- 下一篇: C#调用webservice(二)