C#的类型安全
類型安全應該算是CLR最重要的特性之一了,在運行時,CLR總是知道一個對象的類型。在C#中可以調用GetType()來返回調用對象的類型,并且由于GetType()繼承于System.Object對象,并且為非虛的方法,所以一個類型不可能通過重寫此方法而偽裝成另一種類型。
由于在開發的過程中,經常會需要將一個對象從一種類型轉換為其他的類型,所以CLR允許將一個對象強制轉換成它本身所引用的類型或派生其的基類型。一個對象向其父類的轉換CLR認為是一種安全的隱式轉換,不需要任何特殊的然而需要將一個對象轉換為其派生類型時,則需要進行顯示的轉換,因為這樣的轉換可能在運行時失敗。
下面來看一個例子:
?1namespace?LearnProject?{
?2????class?Program?{
?3????????
?4????????static?void?Main(string[]?args)
?5????????{
?6????????????//此類型轉換不需要顯示的進行,因為new返回的對象類型為Student
?7????????????//Person是Student的基類
?8????????????Person?student?=?new?Student();
?9????????????student.Eat();
10????????????//虛方法Work()在子類Student中被重寫?[多態的應用]
11????????????student.Work();
12????????????//使用Object類型的變量去保存Student對象的引用依然不需要進行任何顯示的轉換
13????????????//任何類型均是由System.Object派生而來
14????????????Object?objStudent?=?new?Student();
15
16????????????//將Object類型objStudent轉換成其派生類型Student則需要強制類型轉換
17????????????Student?studentObj?=?(Student)objStudent;
18
19????????????Program?p?=?new?Program();
20????????????//編譯器會自動檢測將要進行強制類型轉換的對象是否為目標類型的基類或者派生類型,如果不是則在編譯期出現錯誤
21????????????Student?studentProgram?=?(Student)p;
22
23????????????//然而此用顯式的轉換則能夠正常通過編輯,但是會在運行時拋出一個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("沒有工作,需要上學");
24?????????}
25?????}
轉載于:https://www.cnblogs.com/zuking/p/3947401.html
總結
- 上一篇: Python 学习笔记(2) - 基本概
- 下一篇: C#调用webservice(二)