根据我对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
投射会更好?
答案 0 :(得分:26)
本次讨论中有几点值得注意。
两个工作方式(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”,但这就是我喜欢构建代码的方式。
答案 1 :(得分:12)
您需要使用as
投射两种情况:投射到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).
`
答案 2 :(得分:5)
他们实际上做了不同的事情......当你说
时myvar as ClassName
你真的只是让编译器知道这个对象是ClassName或ClassName的子类
当你说:
ClassName(myvar)
它实际上试图将其转换为该类型的对象。
因此,如果您的对象是该类的下降而您不需要转换它,则可以使用作为
的示例:
var myvar:String = '<data/>';
var othervar:XML = XML(myvar); //right
var myvar:String = '<data/>';
var othervar:XML = (myvar as XML); //wrong
var myvar:XML = <data/>;
var othervar:XML = myvar as XML; // right
答案 3 :(得分:1)
对数组使用'as'。
var badArray:Array;
badArray = Array(obj);
将在第一个元素中生成一个长度为1的数组,其中包含原始数组。如果您使用如下的“as”,则会得到已删除的结果。
var goodArray:Array;
goodArray = obj as Array;
通常,“as”优于ActionScript中的“Class()”,因为它的行为更像是在其他语言中进行投射。
答案 4 :(得分:0)
当我有一个ArrayCollection对象并需要枚举它们或使用选择器函数时,我会使用它。
e.g。
var abc:mytype = mycollection.getItemAt(i)as mytype