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     }

时间: 2024-10-06 12:12:20

C#的类型安全的相关文章

Java是类型安全的语言,而C++是非类型安全的?【解释】

有过C++开发经验的人会发现,我们可以将0作为false,非零作为true.一个函数即使是bool类型的,但是我们还是可以返回int类型的,并且自动将0转换成false,非零转换成true.代码实例如下: #include<iostream> #include<stdlib.h> using namespace std; bool fun()//函数返回类型是bool,但是我们在函数中可以返回int类型. { return 1; } void main() { int a=1; i

类型安全---泛型与非泛型

============================================================非泛型 -------------------------LinkedListNode.cs类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplicati

微信JSAPI模式与浏览器类型安全访问

摘要: 微信浏览器是在微信安装时内置在微信中的,针对浏览器的类型我们可以设置相应的安全策略--仅允许在微信内置浏览器中打开.本文选自<微信企业号开发完全自学手册>. 1 JSAPI模式介绍 在介绍JSAPI模式之前,首先需要介绍一下微信内置浏览器.可能很多人注意到了,在打开微信"朋友圈"链接的时候会出现进度条,如图5.1所示,这实际上就是微信内置浏览器访问页面的进度.也就是说,"朋友圈"是通过微信内置的浏览器访问的手机页面,并且微信浏览器是在微信安装时内

类型安全和安全性

类型安全代码只访问被授权可以访问的内存位置.(在本讨论中,类型安全特指内存类型安全,不应与范围更广的类型安全混淆.)例如,类型安全代码不能从其他对象的私有字段读取值. 它只以定义完善的允许方式访问类型. 在实时 (JIT) 编译期间,可选的验证过程检查要实时编译为本机代码的方法的元数据和 Microsoft 中间语言 (MSIL),以验证它们是否为类型安全. 如果代码具有忽略验证的权限,则将跳过此过程. 有关验证的更多信息,请参见托管执行过程. 尽管类型安全验证对于运行托管代码不是强制的,但类型

第29条:优先考虑类型安全的异构容器

一个Set只有一个类型参数,表示它的元素类型,一个Map有两个类型参数,表示它的键和值类型. 但是有时候,需要更多的灵活性,如,数据库行有任意多的列,希望能以类型安全的方式访问所有的列.办法是将键进行参数化而不是将容器参数化,然后将参数化的键提交给容器,来插入或者获取值.用泛型系统来确保值的类型与它的键相符. 例子: public class Favorites { private Map<Class<?>, Object> favorites = new HashMap<C

Swift之类型安全和类型推断

Swift是一种类型安全的语言.类型安全的语言鼓励推荐在你代码中的值尽量要清楚其所属的类型.如果在你的代码中有一个预先好的字符串,你就不能错误地把他传递或者赋值给一个整数. 因为Swift是类型安全的,当编译你的代码时就会做类型检测并且以错误的方式标识出所有的不匹配的类型.这样使你能够在开发过程中捕获尽早的定位错误. 类型检测能帮助你避免你在不同类型之间工作时出现错误,这意并不意味着你必须为每一个声明的常量和变量指定一个明确的类型.如果你不为你需要的值指定类型,Swift就会用类型推断来计算出其

Swift语言指南(四)--类型安全和类型推断

Swift是一门类型安全语言,类型安全语言需要代码里值的类型非常明确.如果你的代码中有部分值需要String类型,你就不能错误地传递Int. 鉴于Swift的类型安全,编译代码时,Swift会执行类型检查并将任何类型不匹配的地方标记为错误,使你在开发当中尽可能早的捕获并修正错误. 类型检查有助于你在操作不同值的类型时避免犯错.但这并不意味着你必须在声明每一个常量或变量时去检查类型,如果你不检查所需值的类型,Swift会执行类型推断来计算出相应地类型. 类型推断让编译器在编译代码时,根据你提供的值

类型安全的异构容器

原文:http://gafter.blogspot.com/2006/12/super-type-tokens.html 1. 泛型通常用于集合,如Set和Map等.这样的用法也就限制了每个容器只能有固定数目的类型参数,一般来说,这也确实是我们想要的. 然而有的时候我们需要更多的灵活性,如数据库可以用任意多的Column,如果能以类型安全的方式访问所有Columns就好了,幸运的是 有一种方法可以很容易的做到这一点,就是将key进行参数化,而不是将容器参数化,见以下代码 1 public cla

对C++不是类型安全语言的理解

参见脚本之家:http://www.jb51.net/article/37847.htm 在C++中,可以把0当成bool类型的false,也可以当做int中的数字0.则表示C++不是类型安全语言. 类似的,MFC中的CString也不是类型安全的类.因为其他类型的数据可以通过CSting中的成员函数Format转换成CString. 1 #include<iostream> 2 3 using namespace std; 4 5 bool fun()//函数返回类型是bool,但是我们在函

为什么说泛型是类型安全的

通常说泛型,比如List<T>是类型安全的,为什么这么说呢? 先来看一个类型不安全的例子. class Program { static void Main(string[] args) { var tempArr = new ArrayList(); tempArr.Add(1); tempArr.Add("2"); foreach (var item in tempArr) { int tempInt = (int) item; Console.WriteLine(te