为什么不';t Java、C#和C++;有射程吗?
,以及许多其他语言支持范围,这是一种对整数进行子类型化的方法。 范围是从一个值(第一个)到另一个值(最后一个)的带符号整数值。 在OOP中实现一个与之相同的类是很容易的,但是我认为本机支持该特性可以让编译器进行额外的静态检查 我知道静态地验证在某个范围内定义的变量是否不会在运行时“溢出”是不可能的,也就是说,由于输入错误,但我认为可以采取一些措施。 我考虑了方法(埃菲尔)和规范(),它们给出了更一般的解决方案 <> P>有一个更简单的解决方案,至少在C++、C和java中编译时检查静态的非绑定分配吗?什么 编辑:我知道“范围”可以用于不同的用途:为什么不';t Java、C#和C++;有射程吗?,c#,java,c++,typing,spec#,C#,Java,C++,Typing,Spec#,,以及许多其他语言支持范围,这是一种对整数进行子类型化的方法。 范围是从一个值(第一个)到另一个值(最后一个)的带符号整数值。 在OOP中实现一个与之相同的类是很容易的,但是我认为本机支持该特性可以让编译器进行额外的静态检查 我知道静态地验证在某个范围内定义的变量是否不会在运行时“溢出”是不可能的,也就是说,由于输入错误,但我认为可以采取一些措施。 我考虑了方法(埃菲尔)和规范(),它们给出了更一般的解决方案 P>有一个更简单的解决方案,至少在C++、C和java中编译时检查静态的非绑定分配吗
volume=rangeInt(0,100);
volume=101; // compile error!
volume=getIntFromInput(); // possible runtime exception
谢谢。Java从1.4版开始就有了一个assert关键字。如果您是按合同进行编程,您可以自由地使用这些来检查正确的分配。并且在设置之前,应该检查对象中任何应该在某个范围内的可变属性。您还可以抛出IllegalArgumentException 为什么没有射程类型?我猜想,原来的设计者在C++中没有看到一个,并且认为它和他们试图纠正的其他特征一样重要。p> Pascal(以及Delphi)使用子范围类型,但它仅限于序数类型(整数、字符甚至布尔值) 它主要是一个带有额外类型检查的整数。您可以使用类在其他语言中伪造它。这样做的好处是,您可以应用更复杂的范围。在C中,您可以执行以下操作:
foreach(int i in System.Linq.Enumerable.Range(0, 10))
{
// Do something
}
实际上,子范围类型在实践中不是很有用。我们通常不分配固定长度的数组,也没有理由使用固定大小的整数。通常,当我们看到固定大小的数组时,它们充当枚举,我们有一个更好(尽管“更重”)的解决方案 子范围类型也使类型系统复杂化。在变量之间引入约束比固定常量更有用
(必须提到,在任何合理的语言中,整数的大小都应该是任意的。)当您可以简单地在该范围内执行某些操作时,范围是最有用的。这意味着关闭。对于java和C++,至少一种范围类型比迭代程序要烦人,因为你需要定义一个内部类来定义你要在那个范围内做什么。 C++允许你通过模板实现这些类型,我认为已经有几个库可以做这个了。然而,我认为在大多数情况下,好处太小,无法证明增加的复杂性和编译速度代价是合理的 至于静态断言,它已经存在。 Boost有一个
Boost\u STATIC\u ASSERT
,在Windows上,我认为微软的ATL库定义了一个类似的库
代码> Boo::Type的特性和Booo::MPL可能是实现这类事情的最好朋友。C++的< /P> < P>目前正在实现一个约束值变量库,并将在boost库中提出:
JSR-305提供了对范围的一些支持,但我不知道这何时会成为Java的一部分。拥有自己的灵活性比将其内置到语言中要好。例如,如果您想要饱和算法,而不是对超出范围的值抛出异常,该怎么办?即MyRange<0,100> volume = 99;
volume += 10; // results in volume==100
MyRange卷=99;
体积+=10;//以体积表示的结果==100
< /代码> 我将添加Tom Hawtin响应(我同意),C++的存在范围并不意味着它们将被检查——如果你想与一般语言行为一致的话,例如,数组访问也不一定是范围检查。
对于C#和Java,我相信这是基于性能的决定——检查范围会增加负担并使编译器复杂化
请注意,范围在调试阶段主要是有用的——生产代码中不应出现范围冲突(理论上)。因此,范围检查最好不是在语言本身内部实现,而是在前后条件中实现,这可以(应该)在生成发布版本时去掉。这是一个老问题,但只是想更新它。Java本身没有范围,但是如果您真的想要这个函数,可以使用Commons Lang,它有许多范围类,包括:
IntRange ir = new IntRange(1, 10);
奇怪的是,这在公共数学中并不存在。我在某种程度上同意公认的答案,但我不认为范围是无用的,尤其是在测试用例中。正确的名称是子范围类型萨达称之为范围;Pascal子范围类型。据我所知。好吧,Ada是很久以前的事了。这是“for(inti=0;I<10;I++)”的一点过度复杂,不是吗?是的,但它可以简化列表构建场景中的代码,例如:Enumerable.Range(1,10)。选择(n=>n*5);//返回序列5,10…45,50,也就是说,它似乎与所问的问题没有多大关系。我正要发布一个range+Selective的示例我同意。我做了大量的Pascal编程,坦率地说,范围更多的是一种痛苦,而不是一种好处。我实际上不同意。范围数值在某些应用程序中非常有用,特别是在嵌入式世界中,还允许进行一些静态编译时检查