【问题标题】:Recommended initialization values for numbers推荐的数字初始化值
【发布时间】:2009-07-12 10:48:40
【问题描述】:

假设您有各种基于数字或整数的变量,您希望将它们初始化为某个默认值。但是使用 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 之类的值作为值。我想知道这种事情是否有任何众所周知的编码约定?我想这取决于变量和数据的性质。

这是我的第一个堆栈溢出问题。希望我的问题的要点是有道理的。

【问题讨论】:

    标签: actionscript numbers conventions optional-parameters


    【解决方案1】:

    很多调试器会使用 0xdeadbeef 来初始化寄存器。当我看到它时,我总是会笑。

    但是,老实说,您的问题包含它自己的答案 - 使用您的变量从未预期会成为的值。值是什么并不重要。

    【讨论】:

    • 0xdeadbeef,哈哈。有趣,会留意那个。感谢您的回复。这就是我一直在寻找的东西。我同意使用非预期数字是有道理的。
    【解决方案2】:

    既然您在评论中提问,我将稍微谈谈 C 和 C++。出于效率原因,默认情况下不初始化局部变量和分配的内存。但是调试版本经常这样做以帮助捕获错误。使用的常用值是 0xcdcdcdcd,这是不太可能的。它具有高位设置,并且是一个相当大的无符号数或相当大的负符号数。作为一个指针地址,如果在除 char 之外的任何东西上使用(但不是在 X86 上),它会导致对齐异常,这很奇怪。它作为 32 位浮点数没有特殊含义,因此不是一个完美的选择。

    有时您会在变量中看到部分对齐的值,例如 0xcdcd0000 或 0x0000cdcd。这些至少可以被视为可疑。

    有时会根据库的分配区域使用不同的值。这为您提供了一个可能是错误值起源的线索(即,它本身没有初始化,而是从一个未初始化的值复制而来)。

    无论您从内存中读取何种对齐方式,理想值都是无效的,并且对于所有原始类型都无效。它对人类来说也应该看起来很可疑,所以即使他们不知道惯例,他们也可以怀疑某物是一只脚。这就是为什么 0xdeadbeef 可能是一个不错的选择,因为(十六进制查看)程序员会认识到这是人类的工作,而不是随机的机会。另请注意,它很奇怪,并且设置了高位,因此它可以这样做。

    【讨论】:

      【解决方案3】:

      -1 传统上通常用作“超出范围”或“无效”值,以指示失败或未初始化的数据。再说一次,如果 -1 是变量的语义上有效值……或者您使用的是无符号类型,那么它就在平底锅上。

      【讨论】:

        【解决方案4】:

        您似乎喜欢null(并且有充分的理由),那么为什么不一直使用它呢?

        【讨论】:

        • Actionscript 不接受 null 用于 int 或 number 类型的参数。但是在阅读这个问题时:stackoverflow.com/questions/1003100/… 看起来 NaN 是数字的等效空值。所以我认为这回答了我的问题。但我很好奇其他语言中存在哪些约定。
        【解决方案5】:

        在 ActionScript 中,您只能将 Number.NaN 分配给类型为 Number 的变量,而不是 int 或 uint。

        话虽如此,因为 AS3 不支持命名参数,所以您始终可以查看参数数组(它是所有函数都有的内置数组,除非您使用 ...rest 构造)。如果该数组的长度小于您的数字参数的位置,您就知道它没有被传入。

        【讨论】:

        • 有趣的是我将研究的参数数组。听起来很有用。感谢您的提示。
        【解决方案6】:

        我经常为此使用最大值。正如您所说,零通常是一个有效值。通常 max-int 虽然理论上有效,但可以安全地排除。但不总是;小心点。

        【讨论】:

          【解决方案7】:

          我喜欢0xD15EA5ED,它类似于0xDEADBEEF,但在调试时通常更准确。

          【讨论】:

            猜你喜欢
            • 2010-09-24
            • 1970-01-01
            • 2018-03-06
            • 1970-01-01
            • 2022-11-24
            • 1970-01-01
            • 2023-03-19
            相关资源
            最近更新 更多