假设您要将各种基于数字或基于int的变量初始化为某个默认值。但是使用0可能会有问题,因为0是有意义的并且可能有副作用。
这是否有任何约定?
我最近一直在使用Actionscript,并且有各种带有可选参数的值对象,因此对于大多数变量,我设置为null但是对于数字或整数,我不能使用null。一个例子:
package com.website.app.model.vo
{
public class MyValueObject
{
public function MyValueObject (
_id:String=null,
_amount:Number=0,
_isPurchased:Boolean=false
)
{ // Constructor
if( _id != null ) this.id = _id;
if( _amount != 0 ) this.amount = _amount;
if( _isPurchased != false ) this.isPurchased = _isPurchased;
}
public var id:String;
public var amount:Number;
public var isPurchased:Boolean;
}
}
难点在于,如果值未从其初始值更改,则在上述代码中使用0可能会有问题。很容易检测变量是否具有空值。但是检测0可能不是那么容易,因为0可能是合法的值。我想设置一个默认值,使参数可选,但我也希望稍后在我的代码中检测该值是否从默认值更改而没有难以调试的副作用。
我想我可以使用-1这样的值作为值。我想知道这种事情是否有任何众所周知的编码约定?我想这取决于变量和数据的性质。
这是我的堆栈溢出问题。希望我的问题的主旨是有道理的。
答案 0 :(得分:3)
许多调试器将使用0xdeadbeef来初始化寄存器。我看到的时候总是笑一笑。
但是,说实话,你的问题包含了自己的答案 - 使用一个你的变量预期不会变成的值。价值是什么并不重要。
答案 1 :(得分:1)
值-1
通常用作“超出范围”或“无效”值,以指示失败或未初始化的数据。然后,如果-1是变量的语义有效值,或者你使用的是无符号类型,那么它就会一直向下移动。
答案 2 :(得分:1)
您似乎喜欢null
(并且有充分的理由),为什么不直接使用它呢?
答案 3 :(得分:1)
因为你在评论中提到我会谈一谈C和C ++。出于效率原因,默认情况下不会初始化局部变量和分配的内存。但是调试版本通常会这样做以帮助捕获错误。使用的常见值是0xcdcdcdcd,这是不太可能的。它具有高位设置,并且是相当大的无符号或相当大的负有符号数。作为指针地址,奇怪的是,如果在除了char之外的任何东西上使用(但不在X86上),将导致对齐异常。它没有特殊含义作为32位浮点数,因此它不是一个完美的选择。
有时,您会在变量中看到部分对齐的值,例如0xcdcd0000或0x0000cdcd。这些至少可以被视为可疑。
有时会根据库的分配区域使用不同的值。这可以为您提供一个可能产生错误值的线索(即,它本身未初始化但是从单元化值复制)。
无论您从内存中读取什么对齐并且对所有基本类型都无效,理想值都将无效。它也应该对人类产生怀疑,所以即使他们不了解惯例他们也可以怀疑某事物是一只脚。这就是为什么0xdeadbeef可以成为一个很好的选择,因为(十六进制观看)程序员会认识到这是一个人的工作,而不是随机的机会。另请注意,它是奇数并且设置了高位,因此它具有此功能。
答案 4 :(得分:1)
在ActionScript中,您只能将Number.NaN分配给类型为Number的变量,而不是int或uint。
话虽如此,因为AS3不支持命名参数,所以你总是可以查看arguments数组(它是所有函数都有的内置数组,除非你使用... rest结构)。如果该数组的长度小于数字参数的位置,则表示它未被传入。
答案 5 :(得分:1)
我经常使用最大值。如你所说,零通常是一个有效值。通常,max-int虽然在理论上是有效的,但可以安全地排除。但不总是;小心。
答案 6 :(得分:1)
我喜欢0xD15EA5ED,它类似于0xDEADBEEF,但在调试时通常更准确。