C#是一门强类型语言,一般情况下最好避免将一个类型转换成另一个类型,但是有些时候又不得不进行类型转换。
C#中有三种类型转换(不考虑.Net提供的Parse),如下:
1、使用as操作符转换
2、使用传统c风格的强制转换
3、使用is先做一个转换测试,然后再使用as操作符或者强转。
一、as和强转之间的区别:
1、as转换类型失败时不会抛出异常;
强转类型失败时会抛出异常。
看下面的例子:
使用as把它强转成string类型:
使用强转把它转换成string类型:
C#中有三种类型转换(不考虑.Net提供的Parse),如下:
1、使用as操作符转换
2、使用传统c风格的强制转换
3、使用is先做一个转换测试,然后再使用as操作符或者强转。
一、as和强转之间的区别:
1、as转换类型失败时不会抛出异常;
强转类型失败时会抛出异常。
看下面的例子:
首先定义一个object类型的变量obj,
object obj = new object();
使用as把它强转成string类型:
string str = obj as string;
if (str == null)
{
Console.WriteLine("转换失败!");
}
else
{
Console.WriteLine("转换成功!");
}
发现,在若使用as进行转换,则会打印“转换失败”;
使用强转把它转换成string类型:
try
{
string str = (string)obj;
if (str == null)
{
Console.WriteLine("转换失败!");
}
else
{
Console.WriteLine("转换成功!");
}
}
catch (System.Exception ex)
{
Console.Write(ex.Message);
}
此时,使用强转会直接抛出异常,捕获异常信息,在屏幕上打印:
无法将类型为“System.Object”的对象强制转换为类型“System.String”
2、处理用户自定义转换不同
首先我们看下下面的转换是否能转换成功:
public class logger { }
public class Foo { }
/// <summary>
/// 定义隐式类型转换
/// </summary>
public class Foo1 : Foo
{
private logger _value;
public static implicit operator logger(Foo1 foo1)
{
return foo1._value;
}
}
static void Main(string[] args)
{
object foo = new Foo1();
try
{
logger myfoo1 = (logger)foo;
Console.WriteLine("Convert success");
}
catch (System.Exception ex)
{
Console.WriteLine("Convert fail");
}
}
答案是转换失败,原因是在程序编译阶段,我们自定义的隐式转换就会被处理,在运行时无效。上述代码中,程序在编译时先会找从foo转换成logger的方法,而我们定义的是从foo1到logger的隐式转换,显然不合适。然后程序生成相应的代码,在运行时进行转换,而此时我们自定义的类型转换在运行时是无效的,程序也就找不到运行时类型转换的方法,也就报出异常。我们要想转换成功,可进行如下的修改:
<pre name="code" class="csharp">static void Main(string[] args)
{
object foo = new Foo1();
try
{
Foo1 foo1 = foo as Foo1;
logger myfoo1 = (logger)foo1;
Console.WriteLine("Convert success");
}
catch (System.Exception ex)
{
Console.WriteLine("Convert fail");
}
}
先利用as将foo转换成fool1,然后再利用我们定义的隐式转换完成转换。3、as不能利用值类型,因为值类型不能为null,只能利用引用类型
object foo = new Foo1();
int i = foo as int;//编译失败
为了解决这一问题,我们引入is先对变量进行检验:
<span style="white-space:pre"> </span> int i = 0;
object foo = new Foo1();
if (foo is int)
{
i = (int)foo;
}
logger log = null;
if (foo is logger)
{
log = foo as logger;
}