我最近开始使用JSON和ExtJs框架,我在一个例子中遇到了以下代码。
我们使用以下方法从前端检索信息:
object updatedConfig = JavaScriptConvert.DeserializeObject(Request["dataForm"]);
然后在示例中,他们执行以下操作:
JavaScriptObject jsObj = updatedConfig as JavaScriptObject;
我从未见过像以前那样使用的“as”关键字。这只是将updatedConfig变量明确地装入JavaScript对象的另一种形式,还是我不了解这个?
由于
答案 0 :(得分:4)
这被称为安全演员阵容。它的作用是尝试从一种类型转换为另一种类型,如果转换失败则返回null
而不是抛出InvalidCastException
。
实际上有两个单独的IL指令来处理“as
”转换和正常静态转换之间的区别。以下C#代码包含两种类型的转换:
using System;
class Program
{
static void Main()
{
Object o = null;
String s0 = (String)o;
String s1 = o as String;
}
}
第一个演员使用castclass
IL指令,第二个演员使用isinst
指令。
请参阅Casting vs using the 'as' keyword in the CLR以获取更详细的说明。
答案 1 :(得分:3)
as keyword是一种在C#中转换对象的更安全的方法。
SomeType a = obj as SomeType;
表示如果obj
属于SomeType
类型,obj
将被投射到该类型中。如果obj
为空或不是SomeType
类型,则a将为空。
答案 2 :(得分:0)
as关键字的另一个优点是,如果无法转换类型,它将抛出编译时异常,而(cast)在运行时不会中断。
答案 3 :(得分:0)
此外,重要的是要记住“as”在引用中操作而不是在对象本身中操作。这就是为什么它可以返回null而不是抛出异常,因为该对象将保持不变。这就是为什么你只能在引用类型上做到这一点。
通常它并不重要,但是如果你实现了一个强制转换函数(比如MSDN中的那个),那么使用as运算符将不来调用它。
因此,as运算符对于“上下继承hiearchy”很有用:如果你有一个Person类,你可以这样做: 人p =新人(); ojbect o = p作为对象; p = o as Person; 但是在所有情况下,内存中的对象都不会以任何方式被修改,只是对它的引用。
希望有所帮助