所谓的 类型安全 怎么理解

caleeoo 2010-01-01 10:18:52
所谓的 类型安全 怎么理解
...全文
369 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Damon_lan 2010-08-06
  • 打赏
  • 举报
回复
呵呵。学习了。。今天在做作业 刚好碰到这个词。。
koukoujiayi 2010-01-03
  • 打赏
  • 举报
回复
谈所谓类型安全,首先要谈什么是类型不安全?
我想一种类型能够通过编译,但运行出错就是不安全的!!
例如:
ArrayList list = new ArrayList();
list.Add(1);
string number = (string)list[0];
上例代码通过编译,但运行引发异常,所以这是典型的类型不安全!!
针对上述类型不安全,引入了泛型很好地解决了类型的不安全!!
丁码农 2010-01-02
  • 打赏
  • 举报
回复
C#的类型安全
类型安全应该算是CLR最重要的特性之一了,在运行时,CLR总是知道一个对象的类型。在C#中可以调用GetType()来返回调用对象的类型,并且由于GetType()继承于System.Object对象,并且为非虚的方法,所以一个类型不可能通过重写此方法而伪装成另一种类型。

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

下面来看一个例子:

Code
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}
Code
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 }


由上面代码可知,当强制转换Object类型对象时,编辑器并不知道变量引用的对象是什么类型,所以可以顺利的通过编辑,但是在运行时,CLR知道Obj保存的对象类型为Program,即不是Student 的基类型也不是Student 的派生类型,所以在运行时,此强制类型转换将抛出上述异常。因此,尽可能的在开发过程中操持代码类型的安全,由编辑器生成一个编译时错误,而避免在运行时才看到异常。

only_lonely 2010-01-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyq11 的回复:]
CLR一个很重要的特性就是Type安全。CLR在任何时候都知道某个对象的类型。
CLR  在对一个引用对象进行操作时,它先会检查此引用的类型
[/Quote]

在Object类中,有一个非虚无法重写的方法 叫 GetType() 能获得对象的准确类型
因为所有类都继承自Object,所以CLR能在实时的确定某一个对象的类型

至于 Object类中的具体实现,是这样滴

[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();

MethodImplAttribute 这个属性,你可以查查MSDN,大概的意思就是说

这不是一个在类中实现的方法,而是引用自CLR实现的一个方法

至于CLR怎么实现实时的获取类的实际类型

抱歉,偶也不是很清楚,但一定与元数据有关

以上,纯属个人观点,望LZ看的时候注意鉴别
hahayanjing 2010-01-02
  • 打赏
  • 举报
回复
mark
wuyq11 2010-01-01
  • 打赏
  • 举报
回复
CLR一个很重要的特性就是Type安全。CLR在任何时候都知道某个对象的类型。
CLR 在对一个引用对象进行操作时,它先会检查此引用的类型
Snowdust 2010-01-01
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20050203/09/3772232.html

111,082

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧