可能重复:
使用CLR中的'as'关键字进行转换
我最近了解了一种不同的演员方式.而不是使用
SomeClass someObject = (SomeClass) obj;
Run Code Online (Sandbox Code Playgroud)
可以使用以下语法:
SomeClass someObject = obj as SomeClass;
Run Code Online (Sandbox Code Playgroud)
如果obj不是SomeClass,它似乎返回null,而不是抛出一个类转换异常.
我看到如果转换失败并且我尝试访问someObject变量,这可能导致NullReferenceException.所以我想知道这种方法背后的理由是什么?为什么要使用这种方式而不是(旧)方式 - 它似乎只是将失败的演员问题"更深"地转移到代码中.
Bri*_*all 160
使用"经典"方法,如果转换失败,则抛出异常.使用as方法,它会导致null,可以检查它,并避免抛出异常.
此外,您只能对引用类型使用"as",因此如果要对值类型进行类型转换,则仍必须使用"经典"方法.
注意:
该as方法只能用于可以赋值的类型null.这种用法仅表示引用类型,但是当.NET 2.0出现时,它引入了可空值类型的概念.由于可以为这些类型分配null值,因此它们可以与as运算符一起使用.
Mat*_*ský 31
空比较MUCH比抛出和捕获异常快.例外有很大的开销 - 堆栈跟踪必须组装等.
例外应该代表一种意外状态,这通常不代表情况(哪种情况as更好).
Zoo*_*oba 27
在某些情况下,很容易处理null一个例外.特别是,合并运算符非常方便:
SomeClass someObject = (obj as SomeClass) ?? new SomeClass();
Run Code Online (Sandbox Code Playgroud)
它还简化了您所在的代码(不使用多态性,并根据对象的类型进行分支):
ClassA a;
ClassB b;
if ((a = obj as ClassA) != null)
{
// use a
}
else if ((b = obj as ClassB) != null)
{
// use b
}
Run Code Online (Sandbox Code Playgroud)
如MSDN页面上所指定,as运算符等效于:
expression is type ? (type)expression : (type)null
Run Code Online (Sandbox Code Playgroud)
这避免了完全支持更快类型测试的异常,但也限制了它对支持null类型(引用类型和Nullable<T>)的使用.
as在几种情况下,操作员很有用.
null第三点是微妙但重要的.在使用强制转换运算符的转换和使用运算符成功的转换之间没有1-1映射as.该as操作是严格限制在CLR转换并不会考虑用户定义的转换(转换算符会).
具体而言,as操作员仅允许以下内容(来自C#lang规范的第7.9.11节)
| 归档时间: |
|
| 查看次数: |
93502 次 |
| 最近记录: |