is和as运算符,是用于类型转换的,提供了对类型兼容性的判断。
从而使得类型转换控制在安全的范畴,提供了灵活的类型转换控制。
is
- 检查对象型的兼容性,并返回结果:ture or false
- 如果对象为null,则返回值永远为false
- 如果已知表达式始终为ture或者false,则is 关键字讲导致编译时警告。
- 不会抛出异常
- 不能重载is运算符
- class Class1 {}
- class Class2 {}
- class Class3 : Class2 { }
-
- class IsTest
- {
- static void Test(object o)
- {
- Class1 a;
- Class2 b;
-
- if (o is Class1)
- {
- Console.WriteLine("o is Class1");
- a = (Class1)o;
-
- }
- else if (o is Class2)
- {
- Console.WriteLine("o is Class2");
- b = (Class2)o;
-
- }
-
- else
- {
- Console.WriteLine("o is neither Class1 nor Class2.");
- }
- }
- static void Main()
- {
- Class1 c1 = new Class1();
- Class2 c2 = new Class2();
- Class3 c3 = new Class3();
- Test(c1);
- Test(c2);
- Test(c3);
- Test("a string");
- }
- }
-
-
-
-
-
-
-
as
- 检查对象类型的兼容性,并返回结果,如果不兼容旧返回null
- 不会抛出异常
- 如果判断结果为空,则强制执行类型转换将抛出NullReferenceException 异常
- as必须和引用类型一起使用
- as运算符只执行引用转换和装箱操作,无法进行其他如用户自定义转换。
- class ASSample
- {
- public static void Main()
- {
- object o = new object();
- ASSample b = o as ASSample;
- if (b != null)
- {
-
- }
- }
- }
上面的操作,在语义上等效于:
ASSample b=o is ASSample ? (ASSample)o : (ASSample)null;
总结:
is 和as 提供了灵活的类型转换方式,is一般用于进行类型的判断,而as用于类型的转换。