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

由于对象是多态的,因此基类类型的变量可以保存派生类型。 若要访问派生类型的方法,需要将值强制转换回该派生类型。 不过,在这些情况下,如果只尝试进行简单的强制转换,会导致引发 InvalidCastException 的风险。 这就是 C# 提供 is 和 as 运算符的原因。 您可以使用这两个运算符来测试强制转换是否会成功,而没有引发异常的风险。 通常,as 运算符更高效一些,因为如果可以成功进行强制转换,它会实际返回强制转换值。 而 is 运算符只返回一个布尔值。 因此,如果只想确定对象的类型,而无需对它进行实际强制转换,则可以使用 is 运算符。

下面的示例演示如何使用 is 和 as 运算符从一个引用类型强制转换为另一个引用类型,而没有引发异常的风险。 此示例还演示如何对 as 运算符使用可以为 null 值的类型。

class SafeCasting
{
    class Animal
    {
        public void Eat() { Console.WriteLine("Eating."); }
        public override string ToString()
        {
            return "I am an animal.";
        }
    }
    class Mammal : Animal { }
    class Giraffe : Mammal { } 

    class SuperNova { } 

    static void Main()
    {
        SafeCasting app = new SafeCasting(); 

        // Use the is operator to verify the type.
        // before performing a cast.
        Giraffe g = new Giraffe();
        app.UseIsOperator(g); 

        // Use the as operator and test for null
        // before referencing the variable.
        app.UseAsOperator(g); 

        // Use the as operator to test
        // an incompatible type.
        SuperNova sn = new SuperNova();
        app.UseAsOperator(sn); 

        // Use the as operator with a value type.
        // Note the implicit conversion to int? in
        // the method body.
        int i = 5;
        app.UseAsWithNullable(i); 

        double d = 9.78654;
        app.UseAsWithNullable(d); 

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    } 

    void UseIsOperator(Animal a)
    {
        if (a is Mammal)
        {
            Mammal m = (Mammal)a;
            m.Eat();
        }
    } 

    void UseAsOperator(object o)
    {
        Mammal m = o as Mammal;
        if (m != null)
        {
            Console.WriteLine(m.ToString());
        }
        else
        {
            Console.WriteLine("{0} is not a Mammal", o.GetType().Name);
        }
    } 

    void UseAsWithNullable(System.ValueType val)
    {
        int? j = val as int?;
        if (j != null)
        {
            Console.WriteLine(j);
        }
        else
        {
            Console.WriteLine("Could not convert " + val.ToString());
        }
    }
} 
时间: 2024-12-22 07:46:15

使用 as 和 is 运算符安全地进行强制转换的相关文章

【读书笔记】C#高级编程 第七章 运算符和类型强制转换

(一)运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ -- 移位运算符 << >> 比较运算符 == != < > <= >= 赋值运算符 = += -= *= /= %= &= |= ^= <<= >>= 成员访问运算符(用于对象和结构) . 索引运算符(用于数组和索引器) [] 类型转换运算符 () 条件

java三元运算符与类型强制转换

public class yunsuanfu { public static void main(String[] args) { int a = 5; System.out.println("value is "+((a<5) ? 10.9 : 9)); } } 刚刚看到的一道面试题,第一眼看很简单,就一个三元运算符,如果你觉得输出的结果是9,那就中了这道题的陷阱了,注意下"((a<5) ? 10.9 : 9)",里面有一个10.9,而后面跟了一个9,

《C#高级编程》【第7章】运算符与类型强制转换 -- 学习笔记

       运算符编程语言的基本元素,它使得我们的代码更加的简洁明了.然而我们为了解决操作数类型不同的问题,我们又有引入了强制转换的概念.我们先看看本章的内容构成吧. 1.运算符 我们来看看一些常见的运算符: <1>条件运算符 其语法如下: Condition ? true_Expression : false_Expression 当条件Condition为真时,其将执行true_Expression,否则执行false_Expression. <2> checked 和

C# 运算符和类型强制转换(6) 持续更新

C#支持的运算符 https://msdn.microsoft.com/zh-cn/library/6a71f45d(v=vs.140).aspx checked 和 unchecked byte b = 255; b++; Console.WriteLine(b); byte数据类型 范围 0~255.递增 b 的值会导致溢出.CLR如何处理这个溢出取决于很多因素,包括编译器选项. 可以使用代码块标记 checked,发生溢出,抛出 OverflowException 异常. byte b =

第七章 运算符和类型强制转换

SimpleCurrency using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleCurrency { class Program { struct Currency { public uint Dollars; public ushort Cents; public Currency(uint dollars, ushort cents) {

输入与输出,数据类型,强制转换,运算符

输入与输出 输出console.write();不换行 输出console.writeline();打印之后换行 输入console.read();不换行 输入console.readline();换行 字符串之间运用加号进行拼接,数字之间加号表示运算. 数据类型: int(整型)   long  double(双精度浮点数)  string(字符串型)  bool 强制转换: int a=covert.toint32(console.readline()); int a=int.parse(c

PHP强制转换类型

获取数据类型 : 1.如果想查看某个表达式的值和类型,用var_dump(). 2.如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype().3.要查看某个类型,不要用 gettype(),而用is_type() 函数. ■字符串转换为数值 当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值. 如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作 float 来求值.否则就被当作整数. 该值由字符串最前面的部分决定.如果字符串以合法的数字数据开始,就用该

PHP类型转换&amp;&amp;类型强制转换

获取数据类型 : 如果想查看某个表达式的值和类型,用 var_dump(). 如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype(). 要查看某个类型,不要用 gettype(),而用 is_type() 函数. ■字符串转换为数值 当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值. 如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作 float 来求值.否则就被当作整数. 该值由字符串最前面的部分决定.如果字符串以合法的数字数据开始,就用该数字作

mfc 类型间的强制转换

一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换. 进行上行转换(把子类的指针或引用转换成基类表示)是安全的: ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum.这种转换的安全性也要开发人员来保证. ③把空指针转换成目标类型的