Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么不';t Java、C#和C++;有射程吗?_C#_Java_C++_Typing_Spec# - Fatal编程技术网

为什么不';t Java、C#和C++;有射程吗?

为什么不';t Java、C#和C++;有射程吗?,c#,java,c++,typing,spec#,C#,Java,C++,Typing,Spec#,,以及许多其他语言支持范围,这是一种对整数进行子类型化的方法。 范围是从一个值(第一个)到另一个值(最后一个)的带符号整数值。 在OOP中实现一个与之相同的类是很容易的,但是我认为本机支持该特性可以让编译器进行额外的静态检查 我知道静态地验证在某个范围内定义的变量是否不会在运行时“溢出”是不可能的,也就是说,由于输入错误,但我认为可以采取一些措施。 我考虑了方法(埃菲尔)和规范(),它们给出了更一般的解决方案 P>有一个更简单的解决方案,至少在C++、C和java中编译时检查静态的非绑定分配吗

,以及许多其他语言支持范围,这是一种对整数进行子类型化的方法。 范围是从一个值(第一个)到另一个值(最后一个)的带符号整数值。 在OOP中实现一个与之相同的类是很容易的,但是我认为本机支持该特性可以让编译器进行额外的静态检查

我知道静态地验证在某个范围内定义的变量是否不会在运行时“溢出”是不可能的,也就是说,由于输入错误,但我认为可以采取一些措施。 我考虑了方法(埃菲尔)和规范(),它们给出了更一般的解决方案

<> P>有一个更简单的解决方案,至少在C++、C和java中编译时检查静态的非绑定分配吗?什么

编辑:我知道“范围”可以用于不同的用途:

  • 迭代器
  • 统计员
  • 整数子类型
  • 我将关注后者,因为前者很容易在C*语言上映射。 我考虑一组封闭的值,比如音乐音量,即从1到100的范围。我想增加或减少一个值。我希望在出现静态溢出时出现编译错误,例如:

    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编程,坦率地说,范围更多的是一种痛苦,而不是一种好处。我实际上不同意。范围数值在某些应用程序中非常有用,特别是在嵌入式世界中,还允许进行一些静态编译时检查