as和is,但is也有as所没有的功能[C#] --转载 甘木
在C#中,我们可以使用is as操作符来判断某数据类型和其它指定类型的关系
1. 用is运算符验证基础类型
C#允许在继承链中向下转型,所以如果DerivedClass派生自BaseClass,那么DerivedClass a; a is BaseClass返回true
2. 用as而不是强制转换
as运算符在某些情况下能代替强制转换操作,我们推荐使用as而不是以前的强制转换,因为普通的强制转换如果失败,会抛出一个需要处理的异常;但是as转换如果失败,仅是把转换结果变为null,而不是抛出一个异常。
3. as是is的语法糖
下面两段代码是一个效果
1Foo f = x as Foo;
2
3var temp = x;
4Foo f = (temp is Foo) ? (Foo)temp : (Foo)null;
具体参见Eric大大的blog
http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is.aspx
4. as 不是万能转换器
例如:用户自定义转换
1ClassA{
2
3publicstaticexplicitoperator ClassB (ClassA a){
4
5returnnew ClassB();
6
7}
8
9}
10
11ClassA a=new ClassA();
12
13ClassB b;
14
15b=(ClassA)a;//正确。通过自定义转换
16
17b=a as ClassB;//返回null。is判断就不会通过
as运算符只执行引用转换和装箱转换。
as运算符无法执行其他转换,如用户定义的转换,这类转换应使用case表达式来代替其执行。
虽说as是is的语法糖,但是is能够用于不可为空类型判断,而as就不能。
"a as int;"这样的代码会错误,除非是“a as int?;”,“ a is int”这样的代码就是没问题的
int a=3;
Console.WriteLine ( a isint );//正常判断,输出true
int? b = a asint?;//正常转换
int c = a asint;//报错:as不能用于不能为null的类型转换
5. 总结
1. as是is的语法糖,即as是否能正确转换,内部还是靠is的验证的。
1.1. 虽说是语法糖,但是is能作用于不可为空类型(例如:值类型),as不能作用于此类型
2. as比强制转换能好,毕竟转换失败它不会抛出异常。
3. as不是万能的,例如强制转换能够处理“用户自定义转换”,而as就不行了。
6. 鸣谢
as不能作用于不能为空的类型转换,而is就可以:@Zhenway
实践出真知:@Snokye
及各位耐心阅读并提出意见的朋友 :)
还有其它不正确的地方请多多指教 !