当然,我知道无符号整数(uint)和有符号整数()之间的基本区别int.
我注意到在.NET公共类中,一个被调用的属性Length总是使用有符号整数.
也许这是因为无符号整数不符合CLS.
但是,例如,在我的静态函数中:
public static double GetDistributionDispersion(int tokens, int[] positions)
Run Code Online (Sandbox Code Playgroud)
参数tokens和所有元素positions都不能为负数.如果它是否定的,最终结果是无用的.因此,如果我同时使用intfor tokens和positions,我必须在每次调用此函数时检查值(如果发现负值,则返回非感知值或抛出异常),这很乏味.
好的,那么我们应该使用uint两个参数.这对我来说真的很有意义.
然而,我发现,在许多公共API中,它们几乎总是在使用int.这是否意味着在他们的实现中,他们总是检查每个值的负面(如果它应该是非负的)?
总而言之,我该怎么办?
我可以提供两种情况:
我们应该对这两种情况使用不同的方案吗?
彼得
PS:我做了很多研究,仍然没有理由说服我不要使用uint:-)
我看到三种选择.
使用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,那就有效了.
您有理由在您的域中要求非负面性.它正在建模一些概念.不妨将这个概念推广到域模型中的真实对象,并封装随附的所有概念.