社区
C#
帖子详情
所谓的 类型安全 怎么理解
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
springmvc3.0所需jar绿色包
2. **
类型
安全
的参数绑定**:通过 `@RequestParam` 和 `@PathVariable` 注解,Spring MVC 3.0 支持了
类型
安全
的参数绑定,避免了
类型
转换异常,提高了代码的健壮性。 3. **支持JSR-303/JSR-349(Bean Validation)*...
类型
安全
与 线程
安全
、异常
安全
、事务
安全
(1)
类型
安全
类型
安全
很大程度上可以等价于内存
安全
,
类型
安全
的代码不会试图访问自己没被授权的内存区域。“
类型
安全
”常被用来形容编程语言,其根据在于该门编程语言是否提供保障
类型
安全
的机制;有的时候也用...
C#中委托为什么
类型
安全
C#中的委托 和 C++中的函数指针 非常相似 都是在一个方法参数中传入 另一个方法的指针 但是C#中传入的是delegate定义的方法, ...但是C#中被delegate定义的方法在传入对应的方法时候,会监测对应的方法参数和方法
类型
Java 高并发(五种线程
安全
类型
、线程
安全
的实现、枚举
类型
)
Java语言中各种操作共享的数据有5种
类型
:不可变、绝对线程
安全
、相对线程
安全
、线程兼容、线程独立 ① 不可变 不可变(Immutable) 的对象一定是线程
安全
的,不需要再采取任何的线程
安全
保障措施。 只要能...
网络
安全
--入侵攻击
类型
随着计算机网络的飞速发展,网络信息的
安全
问题也日渐突出,它已经成为了计算机领域的一个重大课题。现阶段,网络攻击的手段花样不断更新,层出不穷,大致来说,可以分为如下六类:信息收集型攻击、访问类攻击、Web...
C#
111,082
社区成员
642,569
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章