4 回答
TA贡献1821条经验 获得超6个赞
使用“经典”方法,如果强制转换失败,则会引发异常。使用as方法,它将导致null,可以对其进行检查,并避免引发异常。
另外,只能将“ as”与引用类型一起使用,因此,如果将类型转换为值类型,则仍必须使用“经典”方法。
注意:
该as
方法只能用于可以分配null
值的类型。这种用法仅表示引用类型,但是当.NET 2.0出现时,它引入了可为空的值类型的概念。由于可以为这些类型分配一个null
值,因此可以与as
运算符一起使用。
TA贡献1796条经验 获得超10个赞
空比较MUCH快于抛出和捕获异常。异常会产生大量开销-必须组装堆栈跟踪等。
异常应该代表一个意想不到的状态,通常不代表这种情况(这是as
工作得更好的时候)。
TA贡献1836条经验 获得超13个赞
在某些情况下,处理null异常要容易一些。特别地,合并运算符非常方便:
SomeClass someObject = (obj as SomeClass) ?? new SomeClass();
它还根据对象的类型简化了代码所在的位置(不使用多态性和):
ClassA a;
ClassB b;
if ((a = obj as ClassA) != null)
{
// use a
}
else if ((b = obj as ClassB) != null)
{
// use b
}
如MSDN页面上所指定,as运算符等效于:
expression is type ? (type)expression : (type)null
这样可以完全避免使用异常,而希望使用更快的类型测试,但也将它的使用限制为支持的null类型(引用类型和Nullable<T>)。
TA贡献1804条经验 获得超8个赞
该as
经营者是一对夫妇的情况下有用。
当您只需要知道某个对象是特定类型,而无需专门对该类型的成员进行操作时
当您想避免出现异常而改为明确处理时
null
您想知道对象之间是否存在CLR转换,而不仅仅是一些用户定义的转换。
第三点很微妙但很重要。在强制转换操作符将成功执行的强制转换与强制转换操作符将成功执行的强制转换之间没有1-1映射as
。该as
操作被严格限制在CLR转换并不会考虑用户定义的转换(转换算符会)。
具体来说,as
操作员仅允许以下操作(来自C#语言规范的7.9.11节)
根据E的类型,存在标识(§6.1.1),隐式引用(§6.1.6),装箱(§6.1.7),显式引用(§6.2.4)或拆箱(§6.2.5)转换。到T。
E或T的类型是开放类型。
E是空文字。
- 4 回答
- 0 关注
- 701 浏览
添加回答
举报