首页 > 其他 > 详细

C#的类型安全

时间:2014-08-31 11:42:51      阅读:193      评论:0      收藏:0      [点我收藏+]

类型安全应该算是CLR最重要的特性之一了,在运行时,CLR总是知道一个对象的类型。在C#中可以调用GetType()来返回调用对象的类型,并且由于GetType()继承于System.Object对象,并且为非虚的方法,所以一个类型不可能通过重写此方法而伪装成另一种类型。

由于在开发的过程中,经常会需要将一个对象从一种类型转换为其他的类型,所以CLR允许将一个对象强制转换成它本身所引用的类型或派生其的基类型。一个对象向其父类的转换CLR认为是一种安全的隐式转换,不需要任何特殊的然而需要将一个对象转换为其派生类型时,则需要进行显示的转换,因为这样的转换可能在运行时失败。

下面来看一个例子:

bubuko.com,布布扣
 1bubuko.com,布布扣namespace LearnProject {
 2bubuko.com,布布扣    class Program {
 3bubuko.com,布布扣        
 4bubuko.com,布布扣        static void Main(string[] args)
 5bubuko.com,布布扣        {
 6bubuko.com,布布扣            //此类型转换不需要显示的进行,因为new返回的对象类型为Student
 7bubuko.com,布布扣            //Person是Student的基类
 8bubuko.com,布布扣            Person student = new Student();
 9bubuko.com,布布扣            student.Eat();
10bubuko.com,布布扣            //虚方法Work()在子类Student中被重写 [多态的应用]
11bubuko.com,布布扣            student.Work();
12bubuko.com,布布扣            //使用Object类型的变量去保存Student对象的引用依然不需要进行任何显示的转换
13bubuko.com,布布扣            //任何类型均是由System.Object派生而来
14bubuko.com,布布扣            Object objStudent = new Student();
15bubuko.com,布布扣
16bubuko.com,布布扣            //将Object类型objStudent转换成其派生类型Student则需要强制类型转换
17bubuko.com,布布扣            Student studentObj = (Student)objStudent;
18bubuko.com,布布扣
19bubuko.com,布布扣            Program p = new Program();
20bubuko.com,布布扣            //编译器会自动检测将要进行强制类型转换的对象是否为目标类型的基类或者派生类型,如果不是则在编译期出现错误
21bubuko.com,布布扣            Student studentProgram = (Student)p;
22bubuko.com,布布扣
23bubuko.com,布布扣            //然而此用显式的转换则能够正常通过编辑,但是会在运行时抛出一个InvalidCastException异常
24bubuko.com,布布扣            Object obj = new Program();
25bubuko.com,布布扣            Student studentObj2 = (Student)obj;
26bubuko.com,布布扣        }
27bubuko.com,布布扣    }
28bubuko.com,布布扣}
bubuko.com,布布扣
 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     }

C#的类型安全

原文:http://www.cnblogs.com/zuking/p/3947401.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!