is 和 as的用法

using System;

namespace _08_继承
{
    class Program
    {
        static void Main(string[] args)
        {
            int age = 18;
            char gender = '男';
            string name = "王五";
            double drive_time = 18.8;

            string interest = "偷拍";
            Driver_1 driv = new Driver_1(name, age, gender, drive_time);

            

            Reporter_ rep = new Reporter_(name, age, gender, interest);

            //里氏转换
            //1) 子类可以赋值给父类,如果有一个地方需要一个父类做参数,我们可以给一个子类代替
            Student_1 s = new Student_1(); //子类
            Person p = s;

            Person p = new Student_1();

            string str = string.Join("|", new string[] { "1", "2", "3", "4", "5", });

            Console.WriteLine(str); //1|2|3|4|5


            //2) 如果父类中装的是子类对象,那么可以将这个父类强转为子类对象

            if (p is Teacher_1)
            {
                Teacher_1 ss = (Teacher_1)p; //强制转换 异常
                ss.TeacherSayHello();
            }
            else
            {
                Console.WriteLine("转换失败");
                Console.ReadKey();
            }

             //is 的用法
            if (p is Student_1)
            {
                Student_1 ss = (Student_1)p; //强制转换
                ss.Xuesheng();
            }
            else
            {
                Console.WriteLine("转换失败");
                Console.ReadKey();
            }

            Student_1 t = p as Student_1; //p 是 student
            Teacher_1 t = p as Teacher_1; //把p父类对象转为teacher;
                                          //as 如果能转换,则返回一个对应的对象,否则返回NUll
                                          // t值为 null

            Student_1 t = p as Student_1; //可以成功
            Console.ReadKey();


            rep.Rep();
            driv.CHLSS();

        }
    }
}

### 关于C#中的`is``as`关键字 #### `is`关键字的用法C#中,`is`关键字用于测试对象是否为特定类型或其派生类型的一部分。如果对象可以安全地转换为目标类型,则返回`true`;否则返回`false`。此操作不会尝试执行实际的类型转换。 以下是`is`关键字的一个简单示例: ```csharp object obj = "test"; if (obj is string) { Console.WriteLine("The object is a string."); } else { Console.WriteLine("The object is not a string."); } ``` 这种语法非常适合用来验证变量的实际运行时类型而不改变原始数据[^1]。 #### `as`关键字的用法 另一方面,`as`关键字也用于类型转换,但它与强制转换不同之处在于它会更优雅地处理失败情况——当无法完成指定类型的转换时,`as`将返回`null`而不是抛出异常(对于可为空的引用类型)。这使得代码更加简洁并减少了不必要的try-catch结构需求。 下面展示了如何利用`as`来进行安全的向下转型: ```csharp object obj = 10; int? number = obj as int?; if (number.HasValue) { Console.WriteLine($"Number value: {number.Value}"); } else { Console.WriteLine("Object cannot be casted to an integer"); } ``` 值得注意的是,只有当源表达式的静态类型是一个引用类型或者可以从目标类型隐式转换过来的时候才可以使用`as`运算符[^2]。 #### 主要差异对比 | 特性 | 使用`is` | 使用`as` | |--------------------|---------------------------------------|-----------------------------------| | 返回值 | 布尔型(true/false) | 转换后的实例(null 或 实际对象) | | 是否引发异常 | 不会 | 如果不成功则返回 null | | 性能影响 | 需要做两次检查(先判断再转换),较慢 | 只做一次尝试性的转换,较快 | 因此,在编写程序逻辑时可以根据具体场景选择合适的工具来实现所需功能[^3]。 ```csharp // Example demonstrating both 'is' and 'as' class Program { static void Main() { var strObj = "hello world"; // Using 'is' if(strObj is string){ System.Console.WriteLine("'strObj' IS indeed a String!"); } // Casting with 'as', then checking result. double? dblResult = strObj as double?; if(dblResult == null){ System.Console.WriteLine("Cannot convert 'strObj' into Double via 'as'."); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘诺西亚的火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值