在.net  平台下类型有两种方式可以进行类型转换,强转或as转换。(有的说法是两种方式都进行强转,有两种强转方式)。

如:typeA objA = (typeA)objB 或者使用另一种typeA objA = objB as objA  这二种有什么不同,先说第二种as 的方法。

首先as只能用于引用类型不能用于值类型。而且是为类型安全,不会抛出错。就是不成功也会你一个NUll。CLR在检查objB 是否与objA有继承关系。如果有就指向一个指针。否则返回NUll.而强转 由于强制类型转换CLR必须首先判断变更引用对象的实际类型,然后CLR必须去遍历继承层次结构,用变量引用类型的每个基类型去核对目标类型,如不成功会在运行时(上面例子)抛出异常,所以好多时候在做强转的时候用is判断就是个这原因,根据MSDN上的解释,它的作用是“检查对象是否与给定类型兼容。实际上它是做一次转换练习。

通过上面,我们可以得出一个这样的结论:as是一种安全的转换,而强转是一种不安全转换(最起码的用is做一次判断)可它可支持值类型。(我找了好久也找不到关于值类型与引用类型在转换时的区别,引用类型可以理解,那值类型是如何实现类型转换的,难道是装箱操作?)

强转不会在编译出错,只会出错在运行阶段。因为它不能动态分析你的类型内部具体细节看以下例子 D是B的子类(以下例子来自.net formwork4)

1 Object o1 = new Object();

2 Object o2 = new B();

3  Object o3= new D();

4  Object o4 =o3;

5  B b1 = new B();

6  B b2 = new D();

7  d d1= new D();

8 B b3 = new Object();

9 D d3 = new Object();

10 B b4 =d1;

11 D d2 =b2;

  12 D d4= (D)d1;

13 D d5= (D)b2;

14 D d6= (D)b1;

15 D b5= (B)O1;

16 B b6= (D)b2;

8,9,11 会在编译时就出错。14,15在运行时出错。这点网上书都有说的,可这么多方法如何理解。

Object 是所有类型的基类。B是父类。如是出现一个显示或试图把一个范围小的类型指针(也就是父类)指向(赋值)一个更大范围的指针(子类型)就会编译错,这很明显你的内存指针范围越界了。(你小子还不够力量,还想让我指向你) 14,15实际也是这样问题,可它们理论上是没问题的,D指向D B指向B (所以编译不会出错),运行时发现问题了,因为犯了与上面一样错。

  你新建的一个对象不会丢(new D) 虽然B指向的,(实际B也仅指向了自己那部分)可占用内存是已经存在的了.所以再次指向,是完全没有问题的 16。

  面象对象的更多理解,如果从内存模型上考虑一切问题会变得很简单.

.net 类型转换的更多相关文章

  1. 为C# as 类型转换及Assembly.LoadFrom埋坑!

    背景: 不久前,我发布了一个调试工具:发布:.NET开发人员必备的可视化调试工具(你值的拥有) 效果是这样的: 之后,有小部分用户反映,工具用不了(没反应或有异常)~~~ 然后,建议小部分用户换个电脑 ...

  2. c# 基础 object ,new操作符,类型转换

    参考页面: http://www.yuanjiaocheng.net/webapi/config-webapi.html http://www.yuanjiaocheng.net/webapi/web ...

  3. Struts2日期类型转换

    针对日期类java.util.Date进行类型转换,要求客户端使用"yyyy-MM-dd","yyyy/MM/dd"中的任意一种输入,并以"yyyy- ...

  4. 【.NET深呼吸】基础:自定义类型转换

    照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写.后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到.于是,老周接受了该朋友的建议 ...

  5. C++四种类型转换方式。

    类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...

  6. struts2类型转换

    1. Struts2中的类型转换 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换! 在Struts2中,类型转换的概念除了用 ...

  7. C++_系列自学课程_第_11_课_类型转换_《C++ Primer 第四版》

    上次说了关于表达式的一些内容,说到还有一些关于数据类型转换的内容,今天我们接着八一八C++中的数据类型转换. 一.隐式类型转换 在表达式中,有些操作符可以对多种类型的操作数进行操作, 例如 + 操作符 ...

  8. Struts2入门(三)——数据类型转换

    一.前言 笔者一直觉得,学习一个知识点,你首先要明白,这东西是什么?有什么用?这样你才能了解.好了,不说废话. 1.1.类型转换为何存在?什么是类型转换? 在MVC框架中,都是属于表示层解决方案,都需 ...

  9. js条件判断时隐式类型转换

    Javascript 中,数字 0 为假,非0 均为真 在条件判断运算 == 中的转换规则是这样的: 如果比较的两者中有布尔值(Boolean),会把 Boolean 先转换为对应的 Number,即 ...

  10. JavaScript中数据类型转换总结

    JavaScript中数据类型转换总结 在js中,数据类型转换分为显式数据类型转换和隐式数据类型转换. 1, 显式数据类型转换 a:转数字: 1)Number转换: 代码: var a = " ...

随机推荐

  1. 【Android】又一个Gank客户端来啦

    介绍 Gank平台的移动端又来了,非常感谢Gank平台开放接口,让我们这些小白有机会练手.学习. 本项目在架构方面有稍微花点心思,虽然还是最简单的MVC模式,但基本参考MVP的思想,Activity只 ...

  2. VR全景智慧城市:VR全景技术分析与研究

    全景智慧城市,多年从事三维全景技术应用的互联网公司,我们利用计算机图形学.多媒体.人工智能和计算机网络技术,深入研发和推广虚拟现实9VR0技术的行业应用.如官方网站升级+720度全景.微网站建设+72 ...

  3. Tips_of_JS 之 利用JS实现水仙花数的寻找与实现斐波那契数列

    一.水仙花数 1.啥是水仙花数? 水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153) 2.利用JS实现对水 ...

  4. Unity C# GetSaveFileName()的应用

    本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/6944870.html 唉哟,这次厉害咯,网上搜罗了好久,终于被我找到汉化的保存对话框了,根 ...

  5. nodejs构建多房间简易聊天室

    1.前端界面代码 前端不是重点,够用就行,下面是前端界面,具体代码可到github下载. 2.服务器端搭建 本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制, ...

  6. scrapy初试

    scrapy初试 创建项目 打开cmd,在终端输入scrapy startproject tutorial,这里将在指定的文件夹下创建一个scrapy工程 其中将会创建以下的文件: scrapy.cf ...

  7. C#开发移动应用系列(3.使用照相机扫描二维码+各种基础知识)

    前言 上篇文章地址: C#开发移动应用系列(1.环境搭建) C#开发移动应用系列(2.使用WebView搭建WebApp应用) 今天我们来讲一下如何使用Camera来调用照相机扫描二维码. (Tips ...

  8. android的drawable资源

    1.android中可以通过xml文件配置资源,比如字符串啦,整数拉.浮点数等等,当然也可以配置图片资源和选择器,下面我们就看看几种图片资源的配置. @1矩形方框,带渐变色的配置代码 <?xml ...

  9. 映射语句之INSERT语句

    1.一个 INSERT SQL 语句可以在<insert>元素在映射器 XML 配置文件中配置 例子: <insert id="insertStudentWithId&qu ...

  10. 为Windows资源管理器右键菜单添加菜单项

    为Windows资源管理器右键菜单添加菜单项 在Windows下命令行用的比较多,经常在资源管理器里翻到某个目录,若想要在此目录下跑命令,只能是打开cmd.exe,然后一路cd才能到达此目录. 每次都 ...