使用uint或int

Pet*_*Lee 10 c# int uint

当然,我知道无符号整数(uint)和有符号整数()之间的基本区别int.

我注意到在.NET公共类中,一个被调用的属性Length总是使用有符号整数.

也许这是因为无符号整数不符合CLS.

但是,例如,在我的静态函数中:

public static double GetDistributionDispersion(int tokens, int[] positions)
Run Code Online (Sandbox Code Playgroud)

参数tokens和所有元素positions都不能为负数.如果它是否定的,最终结果是无用的.因此,如果我同时使用intfor tokenspositions,我必须在每次调用此函数时检查值(如果发现负值,则返回非感知值或抛出异常),这很乏味.

好的,那么我们应该使用uint两个参数.这对我来说真的很有意义.

然而,我发现,在许多公共API中,它们几乎总是在使用int.这是否意味着在他们的实现中,他们总是检查每个值的负面(如果它应该是非负的)?

总而言之,我该怎么办?

我可以提供两种情况:

  1. 这个功能只能由我自己在我自己的解决方案中调用;
  2. 此功能将被其他团队中的其他人用作库.

我们应该对这两种情况使用不同的方案吗?

彼得

PS:我做了很多研究,仍然没有理由说服我不要使用uint:-)

jas*_*son 5

我看到三种选择.

使用uint.该框架不是因为它不符合CLS.但你必须符合CLS吗?(也有一些不太有趣的算术问题突然出现;在整个地方施展都不好玩.因此我倾向于无效uint).

使用int但使用合同:

Contract.Requires(tokens >= 0);
Contract.Requires(Contract.ForAll(positions, position => position >= 0));
Run Code Online (Sandbox Code Playgroud)

明确说明您需要的内容.

创建一个封装需求的自定义类型:

struct Foo {
    public readonly int foo;

    public Foo(int foo) {
        Contract.Requires(foo >= 0);
        this.foo = foo;
    }

    public static implicit operator int(Foo foo) {
        return this.foo;
    }

    public static explicit operator Foo(int foo) {
        return new Foo(foo);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

public static double GetDistributionDispersion(Foo tokens, Foo[] positions) { }
Run Code Online (Sandbox Code Playgroud)

很好.我们不必在我们的方法中担心它.如果我们得到了Foo,那就有效了.

您有理由在您的域中要求非负面性.它正在建模一些概念.不妨将这个概念推广到域模型中的真实对象,并封装随附的所有概念.