根据我对ActionScript的理解,有两种类型的转换:
var bar0:Bar = someObj as Bar; // "as" casting var bar1:Bar = Bar(someObj); // "class name" casting (for want of a better name)
另外,请纠正我,如果我在这里错了,as
cast会返回一个类的实例,或者null
"class name"cast会返回一个类的实例,或者如果演员不可能会引发异常 - 除了这,他们是相同的.
但是,鉴于此,as
施法似乎是对早期失败 - 快速 - 失败 - 早期原则的大规模违反......而且我很难想象一种情况,即使用强制转换as
而不是使用类名转换(可能会instanceof
抛出那里.
所以,我的问题是:在什么情况下使用as
铸造会更好?
这个讨论中有几点值得注意.
这两个工作方式有很大不同,Class()将尝试将对象强制转换为指定的Class,但如果不这样做(有时会依赖于数据类型)会抛出运行时错误.另一方面,使用object作为Class将首先执行类型检查,如果指定的对象无法转换为指定的Class,则返回null值.
这是一个非常重要的区别,是开发中的有用工具.它允许我们执行以下操作:
var o:MyClass = myArray[i] as MyClass; if(o) { //do stuff }
我认为这很有用.
"as"也与语言的其余部分更加一致(即:"myObject is MyClass").
使用简单数据类型(int,Number,uint,string)时,MyClass()方法有其他好处.这方面的一些例子是:
var s:String = "89567"; var s2:String = "89 cat"; var n:Number = 1.9897; var i:int = int(s); // i is = 89567, cast works var i2:int = int(s2); //Can't convert so i2 is set to 0 var i3:int = int(n); // i = 1 var n2:Number = Number(s2); // fails, n2 = NaN //when used in equations you'll get very different results var result:int = int(n) * 10; //result is 10 var result:int = n * 10; //result is 19.89700 var result:int = int(s2) * 10; //result is 0 trace(s2 as Number); //outputs null trace(s2 as int); //outputs null trace(Number(s2)); //outputs NaN
这是一个很好的重要主题,作为一般规则,我在使用简单数据类型时使用Objects和Cast()时使用"as",但这就是我喜欢构建代码的方式.
您需要使用as
两种方案进行转换:转换为a Date
,并转换为Array
.
对于日期,调用Date(xxx)
行为与新行为相同Date().toString()
.
对于数组,调用Array(xxx)
将创建Array
一个元素:xxx.
该Class()
铸造方法已被证明是快于as
铸造,所以它可能是优选的as
,当效率事项(且当不与日期和阵列工作).
import flash.utils.*; var d = Date( 1 ); trace( "'" + d, "'is type of: ",getQualifiedClassName( d ) ); var a:Array = Array( d ); trace( "'" + a, "' is type of: ", getQualifiedClassName( a ) ); //OUTPUT //'Mon Jun 15 12:12:14 GMT-0400 2009 'is type of: String //'Mon Jun 15 12:12:14 GMT-0400 2009 ' is type of: Array //COMPILER ERRORS/WARNINGS: //Warning: 3575: Date(x) behaves the same as new Date().toString(). //To cast a value to type Date use "x as Date" instead of Date(x). //Warning: 1112: Array(x) behaves the same as new Array(x). //To cast a value to type Array use the expression x as Array instead of Array(x).
`
他们实际上做了不同的事情...当你说
myvar as ClassName
您只是让编译器知道此对象是ClassName或ClassName的子类
当你说:
ClassName(myvar)
它实际上试图将其转换为该类型的对象.
因此,如果您的对象是该类的一个或下降,并且您不需要转换它,您将使用as
例子:
var myvar:String = ''; var othervar:XML = XML(myvar); //right var myvar:String = ''; var othervar:XML = (myvar as XML); //wrong var myvar:XML = ; var othervar:XML = myvar as XML; // right