加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么Java,C#和C都没有范围?

发布时间:2020-12-14 05:39:49 所属栏目:Java 来源:网络整理
导读:Ada,Pascal和许多其他语言支持范围,一种子类型整数的方式. 范围是从值(第一)到另一个(最后)的有符号整数值. 实现一个在OOP中执行相同的类很容易,但我认为支持本地功能可以让编译器进行其他静态检查. 我知道,不可能静态地验证一个范围中定义的变量不会“溢出
Ada,Pascal和许多其他语言支持范围,一种子类型整数的方式.
范围是从值(第一)到另一个(最后)的有符号整数值.
实现一个在OOP中执行相同的类很容易,但我认为支持本地功能可以让编译器进行其他静态检查.

我知道,不可能静态地验证一个范围中定义的变量不会“溢出”运行时,即由于输入不良,但我认为可以做一些事情.
我想到了Design by Contract方法(Eiffel)和Spec#(C# Contracts),给出了一个更一般的解决方案.

有没有一个更简单的解决方案,至少在C,C#和Java编译时检查静态的外联分配?某种static-assert?

编辑:我明白“范围”可以用于不同的目的:

>迭代器
>枚举器
>整数子类型

我会专注于后者,因为Former可以很容易地以C *语言映射.
我想到一个封闭的一组值,就像音乐音量,即从1到100的范围.我想增加或减少一个值.我想要一个编译错误,以防止静态溢出,如下所示:

volume=rangeInt(0,100);
volume=101;  // compile error!
volume=getIntFromInput(); // possible runtime exception

谢谢.

解决方法

实际上,子范围类型实际上并不实用.我们不经常分配固定长度的数组,也没有固定大小的整数的原因.通常我们看到固定大小的数组,它们作为一个枚举,我们有一个更好的(虽然“更重”)的解决方案.

子类型也使类型系统复杂化.在变量之间引入约束比固定常数更有用.

(强制性地提到整数应该是任何明智的语言的任意大小.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读