代码之家  ›  专栏  ›  技术社区  ›  jfs

使用无符号图元类型

  •  7
  • jfs  · 技术社区  · 17 年前

    大多数时候,我们表示的概念永远不会小于0。例如,要声明长度,我们可以写:

    int length;
    

    这个名字很好地表达了它的目的,但你可以给它赋值。似乎在某些情况下,你可以通过这样写来更清楚地表达你的意图:

    uint length; 
    

    我能想到的一些缺点:

    • unsigned类型(uint、ulong、ushort)不符合CLS,因此不能与不支持此功能的其他语言一起使用
    • .Net类在大多数情况下使用有符号类型,因此您必须强制转换

    思想?

    6 回复  |  直到 9 年前
        1
  •  5
  •   Konrad Rudolph    17 年前

    在罗马的时候,像罗马人一样做。

    虽然在适用的情况下使用无符号值在理论上有优势,因为它使代码更具表现力,但这在C#中根本没有实现。我不知道为什么开发人员最初没有设计界面来处理 uints 并使CLS型符合要求,但现在列车已经离开车站。

    由于一致性通常很重要,我建议走C#之路,使用 int s

        2
  •  5
  •   Shog9    17 年前

    如果你用0的值递减一个有符号的数字,它就会变为负数,你可以很容易地进行测试。如果你用0的值递减一个无符号数,它会向下流动并成为该类型的最大值——这有点难以检查。

        3
  •  5
  •   Dan Herbert    17 年前

    你的第二点是最重要的。一般来说,你应该只使用 int 因为对于整数值来说,这是一个很好的“包罗万象”。我只会使用 uint 如果你绝对需要计数能力高于 国际性组织 ,但不使用额外的内存 long 需要(内存不会太多,所以不要太便宜:-p)。

        4
  •  2
  •   Rob Bazinet    17 年前

    我认为uint与int的微妙使用会让开发人员感到困惑,除非它被写进公司的开发人员指南中。

    例如,如果长度不能小于零,那么它应该在业务逻辑中明确表示,以便未来的开发人员可以阅读代码并知道真正的意图。

    只有我的2美分。

        5
  •  2
  •   Eric Burnett    17 年前

    我要指出的是,在C#中,你可以打开 /checked 检查算术上溢/下溢,无论如何这都不是一个坏主意。如果关键部分的性能很重要,您仍然可以使用 unchecked 为了避免这种情况。

    对于内部代码(即不会在与其他语言的任何互操作庄园中引用的代码),我投票支持在情况需要时使用unsigned,例如 length 如前所述的变量。这与检查算法一起为开发人员提供了另一个网络,可以更早地发现微妙的错误。

    有符号与无符号争论的另一点是,一些程序员使用-1等值来表示错误,否则它们就没有意义了。我同意这样的观点,即每个变量应该只有一个目的,但如果你或你的同事喜欢以这种方式指示错误,那么让变量签名可以让你在以后添加错误状态。

        6
  •  0
  •   Sander    17 年前

    你的两点很好。不过,避免这种情况的主要原因是选角。选角让它们使用起来非常烦人。我尝试过一次使用无符号变量,但我不得不在所有地方撒强制转换,因为框架方法都使用有符号整数。因此,无论何时调用框架方法,都必须进行强制转换。