Flex3类型转换

3

有人知道Flex 3中类型转换的两种方式之间的真正区别吗?

var myObject1:MyObject = variable as MyObject;
var myObject2:MyObject = MyObject(variable);

我更喜欢使用第二种方法,因为当类型转换失败时它会抛出一个错误,而第一种方法只会返回null。但是还有其他区别吗?也许使用第一种方法有什么优点吗?

4个回答

5
第二种类型的转换对于顶层类型(例如http://livedocs.adobe.com/flex/2/langref/)有不同的行为。例如,Array(obj)并不像您描述的那样直接转换;它会尝试从obj创建一个新的数组,即使obj已经是一个数组。
我确信这种情况下出现意外行为的次数很少,但是出于这个原因我总是使用“as”。这意味着如果我执行以下操作:
int(str) 

我知道这里的cast是“尝试转换”的意思,而不是“我保证它是”。

参考:http://raghuonflex.wordpress.com/2007/07/27/casting-vs-the-as-operator/,已经得到了一些确认。


对于数组使用 [],其余情况使用 () - Amarghosh
我总是使用 "as" 进行类型转换。 - James Ward

2
  • as 方法在强制类型转换失败时返回 null
  • () 方法在强制类型转换失败时会抛出错误。

如果 variable 的值与 MyObject 不兼容,则使用 myObject1 存储的值将为 null,并且当您尝试访问它时,在程序的后续某个位置会出现一个 null 指针错误(1009: 无法访问 null 对象引用的属性或方法)。而如果您使用 MyObject(variable) 语法进行强制类型转换,则会在同一行上得到一个类型强制错误(1034:类型强制失败:无法将 _ 转换为 _)- 这比在稍后出现 1009 并想知道出了什么问题更有帮助。


是的,这就是我在问题中所说的。我想知道是否还有其他区别,因为我不太清楚“as”方法的优势在哪里... - Maurits de Boer
没有任何我能想到的优点 - 我总是使用第二个。 - Amarghosh
2
存在一些副作用:Array(obj) 不会像你描述的那样直接转换;它会尽可能地从 obj 创建一个新的 Array,即使 obj 已经是一个数组。我确信这种情况下出现意外行为的次数很少,但我总是使用 "as"。这意味着如果我执行 int(str),我知道这是在“重装”意义上的转换,而不是“我保证它是”的意义上。 - susichan
+1 对于数组来说非常有用。你应该将其发布为答案。这正是 OP 所询问的 - as 强制转换的优势。 - Amarghosh

1

我记得在这个网站上看到过一个问题,说as()稍微快一点,但我现在找不到那个问题了。

除此之外,这个问题已经被问了很多次,你可以在这里找到更深入的答案。

最近我在 StackOverflow 上搜索时发现了非常有用的[]标签,它允许只搜索带有指定标签的问题。所以你可以进行这样的搜索[actionscript-3] as vs cast。这里还有更多的搜索技巧:https://stackoverflow.com/search

而且,我没有找到关于性能的问题,却写了如何搜索的方法,这其中的讽刺并没有逃过我的眼睛 ;)


0

我认为当强制类型转换失败并且()引发错误时,as返回基类而不是null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接