4

我总是设置变量和函数的类型,这是我从 Java 学习中养成的习惯,似乎是正确的做法。
但是我总是在其他人的代码中看到“弱类型”,但我不能不同意这一点,因为我不知道让所有东西都保持强类型的真正优势是什么。

我想我的问题很清楚,但我会举一些例子:

var id = "Z226";

function changeId(newId){
    id = newId;
    return newId;
}

我的代码是这样的:

var id:String = "Z226";

function changeId(newId:String):String{
    id = newId;
    return newId;
}
4

4 回答 4

7

是的,最大的优势是:

  1. 更快的代码执行,因为运行时知道类型,它不必评估调用
  2. 更好的工具支持:自动完成和代码提示将适用于类型化参数和返回类型
  3. 更好的可读性
于 2012-08-14T19:25:38.677 回答
5

您可以从强类型中获得性能优势。见http://gskinner.com/talks/quick/#45

我还发现强类型代码更具可读性,但我想这取决于他们可能不关心的人。

于 2012-08-14T19:27:00.590 回答
3

正如 florian 所指出的,强类型的两个优点是开发工具可以使用这些信息来提供更好的代码提示和代码补全,以及类型作为变量或方法打算如何使用的明确指示,可以使代码更容易理解。

性能问题似乎有待商榷。但是, stackoverflow 上的这个答案表明,在某些基准测试中,有类型的肯定比无类型的要快,但正如作者所说,在正常情况下你不会注意到它。

但是,我认为强类型的最大优点是,如果您尝试分配或返回错误类型的值,则会出现编译器错误。这有助于防止那种只能通过实际运行程序才能追踪的有害错误。

考虑以下人为设计的示例,其中在返回之前ActionScript自动将结果转换为 a string。强类型方法的参数和返回将确保程序不会编译并发出警告。这可能会为您节省数小时的调试时间。

function increment(value) {
    return value + 1;
}

trace(increment("1"));
// 11
于 2012-08-14T21:47:20.150 回答
1

虽然其他答案中关于代码提示和错误检查的观点是准确的,但我想解决关于性能的说法。这真的不是那么真实。理论上,强类型允许编译器生成更接近原生的代码。但是,对于当前的 VM,不会发生这种优化。AS3 编译器在这里和那里将使用整数指令而不是浮点指令。否则,类型指示符在运行时不会产生太大影响。

例如,考虑以下代码:

function hello():String {
    return "Hello";
}

var s:String = hello() + ' world';
trace(s);

这是由此产生的 AVM2 操作码:

getlocal_0 
pushscope
getlocal_0 
getlocal_0 
callproperty 4 0 ; call hello()
pushstring 12    ; push ' world' onto stack
add              ; concatenate the two
initproperty 5   ; save it to var s
findpropstrict 7 ; look up trace
getlocal_0       ; push this onto stack
getproperty 5    ; look up var s 
callpropvoid 7 1 ; call trace
returnvoid 

现在,如果我删除类型指示符,我会得到以下信息:

getlocal_0 
pushscope 
getlocal_0 
getlocal_0 
callproperty 3 0 
pushstring 11 
add 
initproperty 4 
findpropstrict 6 
getlocal_0 
getproperty 4 
callpropvoid 6 1 
returnvoid 

它完全一样,除了所有名称索引都减少了一个,因为“字符串”不再出现在常量表中。

我并不是要劝阻人们不要使用强类型。人们不应该期待性能方面的奇迹。

编辑:如果有人感兴趣,我已经把我的 AS3 字节码反汇编器放到网上:

http://flaczki.net46.net/codedump/

我已经对其进行了改进,现在它可以取消引用操作数。

于 2012-08-15T00:03:40.567 回答