大龙嘚吧嘚之“C#中的类型转换”

首先,谷歌之:

谷歌答案一:http://blog.itpub.net/14466241/viewspace-700102/

使用C#一个最常见的问题便是各种类型间的转换。

我们知道,C#中的类型分为值类型和引用类型两大类。但是,有关它们间各自转换的细节描述在网上很少得到详细的回答。现在,我结合搜索到的部分资料整理如下:

1,问题

c#中类型转换的有两种,()转换和convert转换。

我想知道的是这两个转换的区别

还有就是()转换我用了发现好多不能转换过来,但是convert是万能转换的,那什么时候该用()什么时候该用convert呢?

最后问下子,把int sum 怎么用()转换成float类型?

请详细说明,最好有举例。

解答:

(1)这两个方法的最大不同是它们对null值的处理方法:

Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常。

没 搞清楚Convert.ToInt32和int.Parse()的细细微区别时千万别乱用,否则可能会产生无法预料的结果,举例来说:假如从url中取一 个参数page的值,我们知道这个值是一个int,所以即可以用 Convert.ToInt32(Request.QueryString["page"]),也可以 用,int.Parse(Request.QueryString["page"]),但是如果page这个参数在url中不存在,那么前者将返回0,0
可能是一个有效的值,所以你不知道url中原来根本就没有这个参数而继续进行下一下的处理,这就可能产生意想不到的效果,而用后一种办法的话没有page 这个参数会抛出异常,我们可以捕获异常然后再做相应的处理,比如提示用户缺少参数,而不是把参数值当做0来处理。

(2)还有一点区别就是

a. Convert.ToInt32(double value)

如果 value 为两个整数中间的数字,则返回二者中的偶数;即 3.5转换为4,4.5 转换为 4,而 5.5 转换为 6。 不过4.6可以转换为5,4.4转换为4

b. int.Parse("4.5")

直接报错:"输入字符串的格式不正确".

c. int(4.6) = 4

Int转化其他数值类型为Int时没有四舍五入,强制转换

int.Parse是转换String为int

Convert.ToInt32是转换继承自Object的对象为int的.

你得到一个object对象,你想把它转换为int,用int.Parse就不可以,要用Convert.ToInt32.

个人总结:

(1)Convert.ToInt32的参数比较多,Int.Parse只能转换string类型的.

(2)Parse就是把String转换成int,char,double....等,也就是*.Parse(string) 括号中的一定要是string.

(3)Convert可以提供多种类型的转换,也就是Convert.*()括号中可以为很多种类型(包括string).

2,问题:

如何使用 as 和 is 运算符安全地进行强制转换?

解答:

首先,在MSDN(http://msdn.microsoft.com/zh-cn/library/cc488006.aspx)给出的解释非常简单,过于简单。

更详细的解释如下:

在程序中,进行类型转换是常见的事。那么在C#中支持以前语言的类型转换方法,即用类型名进行强行转换,例如:

object bjTest = new NewType();

NewType newValue = (NewType)objTest;

但是这样转换,有个严重的问题,就是在把objTest强转换成NewType类型对象的时候,这个过程是不安全的,因此需要用try-catch语句来进行保护。这样一来,比较安全的代码方式应该如下所示。

object bjTest = new NewType();

NewType newValue = null;

try

{

newValue = (NewType)objTest;

}

catch( Exception err )

{

MessageBox.Show( err.Message );

}

但是如上的写法在C#中已经属于过时的写法,而且也属于比较低效的写法。在C#中比较高效而且安全的写法,应该用as操作符,那么完成如上类似功能的正确代码应该如下。

object bjTest = new NewType();

NewType newValue = objTest as NewType;

那么很明显,如上的写法首先看起来很简便,至少代码数量和强转方式一样。至于安全性,对于as操作符来说,它不会做过的转换操作,当需要转换对象的类型属于转换目标类型或者转换目标类型的派生类型的时候,那么此转换操作才能成功,而且并不产生新的对象。因此用as来进行类型转换使安全的。为什么用as操作符进行类型转换的效率要高于老式的类型转换的,因为用as操作符进行转换就如前面所说的,首先判断当前对象的类型,当类型满足要求后才进行转换。而传统的类型转换方式,是用当前对象直接去转换,而且为了保护转换成功,要加上try-catch,这就决定了它的效率不会高于as操作符的效率。

要注意的时候,不管用传统方式,还是用as操作符进行类型转换之后,在使用之前,需要进行判断转换是否成功,如下:

if( newValue!= null )

{

//Work with the object named "newValue"

}

但是,使用as操作符有如下几点限制。

第一个就是,不用在类型之间进行类型转化,即如下编写就会出现编译错误。

NewType newValue = new NewType();

NewType1 newValue = newValue as NewType1;

第二个就是,不能应用在值类型数据,即不能如下写(也会出现编译错误)。

object bjTest = 11;

int nValue = objTest as int;

对于第一点所提的,可以用传统的类型转换方式来完成,但是光用如下的方式,是不能正确完成。

NewTypeOne newTestOne = new NewTypeOne();

NewTypeTwo newTestTwo = (NewTypeTwo)newTestOne;

但是光如上写是不能完成的,要想使如上的操作能正确完成,在原有类型中增加类型转换操作符函数,即需要完成类似如下的代码。

public class NewTypeOne

{

public static  explicit operator NewTypeTwo(
NewTypeOne objTest )

{

//Convert object into new type

}

}

对于第二点所提的,在C#中可以使用is操作符,再加上老式的类型转换操作,就可以安全完成转换,那么要完成如上操作,正确的写法如下。

object bjTest = 11;

if( objTest is int )

{

int nValue = (int)objTest;

}

除了如上两点限制外,在用as操作符来进行类型转换的时候,有个细微的问题。在前面所说的,用as来进行类型转换的时候,所要转换的对象类型必须是目标类型或者转换目标类型的派生类型,那么这样就有个问题,即用as操作符来进行类型转换的时候无法转换成正确的类型,也就是说本来应该转换成子类型,却转换成了父类型。但是我并不认为这是个严重问题,因为在用as操作符来进行类型转换的时候,如何选择目标类型在编码的时候已经很明确了,即用父类型作为目标类型,那么类型转换的目的就是转换成父类型对象进行操作;反之亦然。

在C#中已经提供了一个很好的类型转换方式,那么在进行类型转换的时候,可以按照如下的方式进行选择。


类型转换


使用选择


Object => 已知引用类型


使用as操作符来完成


Object => 已知值类型


先使用is操作符来进行判断,再用类型强转方式进行转换


已知引用类型之间转换


首先需要相应类型提供转换函数,再用类型强转方式进行转换


已知值类型之间转换


最好使用系统提供的Convert类所涉及的静态方法

谷歌答案二:http://www.cnblogs.com/qingsongwang/archive/2013/08/18/3266098.html

在学习到类的继承时,总是对于子类和父类中相互转换以及他们实例调用过程不是很清晰的认识,下面就将其总结下:

父类和子类如何转换?

子类B继承于父类A,子类B中包含了父类A的一些特性(包括重写的一些方法等),子类是可以转换成父类的,但是父类当中没有子类中所拥有的其他特性,因此父类对象不能转换成子类对象

举例:父类Animal    子类Dog

Animal dog1 = new Dog();  //正确
Dog dog2 = new Animal();   //错误
dog1.Eat();  //dog1 被隐式转化成Animal类型后调用的Eat方法是 Animal中的Eat方法
((Dog)dog1).Eat();  调用的是Dog中的Eat方法

实例调用子类中的方法还是父类中的方法,依照被修饰的类型而定;如果方法被重写了,则调用子类中的方法。

大龙嘚吧嘚:

转换:所谓谁1转换成谁2了,其实就是把谁1赋给谁2。当谁1和谁2类型相同自然没有问题。而类型不同的时候,有时也是可以转换滴。比如:object c = new person();这里把person转换成object了(说的不太严谨,大家领悟精神)。那么为什么可以转换呢?

person是子类,object是父类。我对父类和子类的理解就是:父类是一般的情况,要求比较低。而子类是特殊情况,要求比较高。

就像搞对象一样,你把要求高的给了要求低的,要求低的自然没有问题。所以person可以隐式转换为object。

但是你把要求低的,给了要求高的,要求高的可就要考虑考虑了:

1.如果是这种情况,object c = new person();person d = (person)c;c看似是要求低的object,但实际上是要求高的person。所以要求高的person一看是自己的同类,只不过穿了个马甲,自然就同意了呗。

2.而如果是这种情况,object a = new object();bird b = new bird();b = (bird)a;要求高的b一看是要求低的a,根本不是一路人,自然就拒绝了。

补充:

string a = "1223";

int b = (int)a;//不可以这样

int b = Convert.ToInt32( a);//可以这样

convert方法真牛逼啊!

时间: 2024-10-10 20:48:53

大龙嘚吧嘚之“C#中的类型转换”的相关文章

java中强制类型转换

在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换.因为子类拥有比父类更多的属性.更强的功能,所以父类转换为子类需要强制.那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的. 当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了.在Java中我们可以通过

c 中的类型转换

1. c 中的类型转换是临时对变量值的转换,一般分为: 强制类型转换,自动类型转换.自动转换中一般遵守无论表达式的值是什么样的,系统都自动将其 转换为赋值运算符左边变量的类型. 2. 当 int 赋给char 时,将int 保留低 8 位赋给 char 型变量.当 long 赋给 int 时,将 long 的低16 位保留赋给 int 型变量.

在复数类中自定义类型转换函数实现复数和非复数之间的运算

实现复数+double型数据,并且打印运算后实部上的数据 #include <iostream> using namespace std; class Complex { public: Complex( )//定义默认构造函数初始化复数 { real=0; imag=0; } //使用初始化表初始化复数 Complex(double r, double i):real(r),imag(i){} //定义自定义类型转换函数 operator double() { return real; }

struts中的类型转换(2)

第一步:(这一步和其他一样,这里从简) 依旧是新建一个web project,命名为struts2,导入struts2必须的包.在src目录下新建struts.xml,修改web.xml文件. 第二步: 将index.jsp改名为input.jsp(这个不是必须的,事实上也没有必要,此处只是为了便于称呼).Input.jap的代码如下 Java代码   <%@ page language="java" import="java.util.*" pageEnco

理解C#语言中的类型转换----初学者的理解,请大神指教

一下都是在视频教学中学到后的理解,如果说错了请大神指教 C#语言中的类型转换,就是将某个数据要转换成另一个类型的数据. c#语言中的数据类型主要有: char类型(字符类型): string类型(字符串类型): int类型(整数类型): double类型(小数类型): 类型转换主要分为三种: 1:任意类型转换为string类型: 转换代码书写格式为:待转换的数据.Tostring(): a,这里的待转换的数据指的是需要转换的数据或变量.后面的Tostring():是固定书写. 转换完成后的返回类

wxWidgets中的类型转换

1int  to wxString:     wxString str = wxString::Format(wxT("%i"),myInt); 2wxString to int :     int i;  i = wxAtoi(str); 3 string to wxString:     std::string stlString = "sdfas"; wxString mystr(stlString .c_str(),wxConvUTF8); 4 wxStri

Java中数据类型转换

1.Java的数据类型分为三大类 布尔型,字符型和数值型 其中数值型又分为整型和浮点型 2.Java的变量类型 布尔型 boolean 字符型 char 整型    byte,short,int,long 浮点型 float,double 3.数据类型转换 Java中数据类型转换分为三种,简单数据类型转换,字符串与其他类型转换,其他实用数据类型转换 (1)简单数据类型转换 在Java中,整型,实型,字符型被视为简单数据类型. 这些类型级别从低到高:(byte,short,char)-> int

JavaScript中的类型转换(二)

说明: 本篇主要讨论JavaScript中各运算符对运算数进行的类型转换的影响,本文中所提到的对象类型仅指JavaScript预定义的类型和程序员自己实现的对象,不包括宿主环境定义的特殊对象(比如浏览器定义的对象) 上一篇中讨论了JavaScript中原始类型到原始类型的转换,原始类型到对象类型的转换和对象类型到原始类型的转换,这里先提出一个问题 var a = undefined; if(a){ console.log('hello'); }else{ console.log('world')

JavaScript中的类型转换(一)

前言 JavaScript是一种非常灵活的弱类型的语言,它的灵活性的一方面体现在其繁杂多样的类型转换.比如当JavaScript期望使用一个布尔值的时候(比如if语句中)你可以提供任一类型的值,JavaScript会按照需要自行转换类型:当使用==操作符比较两个类型值的时候,也会对两个操作数按需进行转换,同样的事情也发生在使用+,>和<等操作符时.这些灵活繁杂的转换往往会使初学者不知所措,本文对JavaScript的类型转换做一个总结. JavaScript中的类型分类 JavaScript中