AS和IS对于如何安全的“向下转型”提供了较好的解决方案,因此我们有两种转型的选择:
1、使用AS运算符进行类型转换
2、先使用IS运算符判断类型是否可以转换,再使用()运算符进行显示的转换
1、使用AS运算符进行类型转换
2、先使用IS运算符判断类型是否可以转换,再使用()运算符进行显示的转换
先说AS运算符:
AS运算符用于在两个应用类型之间进行转换,如果转换失败则返回null,并不抛出异常,因此转换是否成功可以通过结果是否为null进行判断,并且只有在运行时才能判断。AS运算符有一定的适用范围,他只适用于引用类型或可以为null的类型。
IS运算符:
IS运算符用于检查对象是否与给定类型兼容,并不进行实际的转换。如果判断对象引用为null,则返回false。由于仅仅判断是否兼容,因此不会抛出异常。使用范围,只适用于引用类型转换、装箱转换和拆箱转换,而不支持值类型转换。
AS运算符用于在两个应用类型之间进行转换,如果转换失败则返回null,并不抛出异常,因此转换是否成功可以通过结果是否为null进行判断,并且只有在运行时才能判断。AS运算符有一定的适用范围,他只适用于引用类型或可以为null的类型。
IS运算符:
IS运算符用于检查对象是否与给定类型兼容,并不进行实际的转换。如果判断对象引用为null,则返回false。由于仅仅判断是否兼容,因此不会抛出异常。使用范围,只适用于引用类型转换、装箱转换和拆箱转换,而不支持值类型转换。
在实际工作中尽量使用AS运算符,而少使用()运算符的显示转换的理由:
1、无论是AS和IS运算符,都比世界使用()运算符强制转换更安全。
2、不会抛出异常,免除使用try···catch进行异常捕获的必要和系统开销,只需要判断是否为null。
1、无论是AS和IS运算符,都比世界使用()运算符强制转换更安全。
2、不会抛出异常,免除使用try···catch进行异常捕获的必要和系统开销,只需要判断是否为null。
【示例】
/// <summary>
/// 转储实体
/// </summary>
/// <returns></returns>
public override string ToString()
{
StringBuilder builder = new StringBuilder();
PropertyInfo[] props = this.GetType().GetProperties();
Array.ForEach(props.ToArray(), prop =>
{
object obj = prop.GetValue(this, null);
if (obj is IList)
(obj as IList).AppendEntitySet(builder);
else
{
builder.AppendFormat("{0}:{1}", prop.Name, prop.GetValue(this,null) == null ? "<empty>\n" :
prop.GetValue(this, null).ToString() + "\n");
}
});
return builder.ToString();
}
【示例】
namespace 转换运算符
{
class Program
{
static void Main(string[] args)
{
object o = "dsdsd";
if(o is string)
{
string s = (string)o;
Console.WriteLine("转换成功");
}
else
{
Console.WriteLine("转换失败");
}
object o2 = "fdfdfdf";
if((o2 as string) != null)
{
Console.WriteLine("转换成功");
}
else
{
Console.WriteLine("转换失败");
}
Console.ReadKey();
}
}
}
分析:is返回的是true或false
as返回的是null或转换后的值
【示例】
【示例】
namespace 转换运算符
{
class Program
{
static void Main(string[] args)
{
object o = "dsdsd";
Console.WriteLine(o is string);//true
Console.WriteLine(o is int);//false
Console.WriteLine(o as string);// dsdsd
Console.WriteLine(o as int?);//null as必须与引用类型或可以为null的类型进行转换
Console.ReadKey();
}
}
}