c#有静态类型检查机制,静态类型检查意味着编译时会将类型不符的找出来,使程序在运行时少做一些类型检查。比如参数类型为object,则需要进行一些转换才能完成编译,一种方式是采用as或is,二是采用强类型转换。
一、C#中的is
1、概念
is 运算符检查对象是否与给定类型兼容,并返回一个Bool值,如果一个对象是某个类型或是其父类型的话就返回为true,否则的话就会返回为false,永远不会抛出异常。如果对象引用为null,那么is操作符总是返回为false。
- 只适用于引用类型转换、装箱转换和拆箱转换,而不支持值类型转换
2、示例
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { object o = new object(); if (o is string) { string str = (string)o; Console.WriteLine(str); } else { Console.WriteLine("转换类型失败"); } Console.ReadKey(); } } }
二、C#中as
1、概念
as 运算符用于在可兼容的引用类型之间执行类似于强制类型转换的操作。与强转不同的是,当转换失败时,as 运算符将返回NULL空,而不是引发异常。因此转换是否成功可以通过结果是否为null进行判断。
- AS运算符有一定的适用范围,他只适用于引用类型或可以为null的类型。
2、示例
using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { object o = new object(); string str = o as string; if (str == null) { Console.WriteLine("转换类型失败"); } else { Console.WriteLine("转换类型成功"); } Console.ReadKey(); } } }
三、优先使用is或as,减少使用强类型转换(cast)
-
无论是AS和IS运算符,都比使用(cast)运算符强制转换更安全。
-
不会抛出异常,免除使用try···catch进行异常捕获的必要和系统开销,只需要判断是否为null。
- 使用is或as,待转换的类型如果既不是目标类型,也不是目标类型所派生出来的类型,也不会报异常,只是返回null或false;而强制转换则有可能使用某些类型的转换逻辑来实现类型转换,比如long转为short,则可能丢失信息。
四、is或as不适用的场景
- 值类型不适用is或as:原因是is或者as转换失败会返回null,而值类型不能识别null。除非使用可空类型,比如:
object o = new object(); var i = o as int?; if (i == null) { Console.WriteLine("转换类型失败"); } else { Console.WriteLine("转换类型成功"); } Console.ReadKey();