cwa*_*wap 25 c# language-design const
我一直想知道为什么C#不支持const类或方法级别.我知道Jon Skeet长期以来一直希望支持不变性,并且我认为使用函数const的C++语法可以帮助实现这一点.通过在类级别添加const关键字,我们将获得全面支持.
现在,我的问题是,C#团队没有开发出这种支持的原因是什么?
我想可以通过编译时检查或通过属性创建所有内容,而无需更改CLR.我不介意代码能够通过反射覆盖const行为.
想象一下:
const class NumberContainer
{
public int Number { get; }
}
Run Code Online (Sandbox Code Playgroud)
..这样的类只能在构造时填充,所以我们需要一个构造函数来接受一个int.
另一个例子是方法级别的const:
public int AddNumbers(NumberContainer n1, NumberContainer n2) const
{
return n1.Number + n2.Number;
}
Run Code Online (Sandbox Code Playgroud)
const级方法不应该能够改变它们自己的类中的状态或传递给它们的引用类型的实例.此外,const级函数只能在其范围内调用其他const级函数.
我不确定lambdas和代表是否会使一切都太难(或不可能)实现,但我确信有更多语言和编译器设计经验的人可以告诉我.
正如史蒂夫B在评论中指出的那样,存在readonly使得事情变得更复杂,因为const和readonly它们在期间接近相同runtime,但是readonly在编译期间无法确定值.我想我们可以拥有const和readonly水平,但这可能太混乱了?
那么,没有实现这个的原因是什么?可用性问题(理解C++中的常量通常对新用户来说很难),语言设计问题(无法完成)或仅仅是优先级问题(不变性的时代 - 嗡嗡声已经结束).
Han*_*ant 25
冒一个有点循环的解释,C#不支持const,因为CLR无论如何都不支持它.CLR不支持它,因为它非常符合CLS.
很少有语言拥有这个概念.C语言支持const,通过readonly关键字在C#中得到很好的支持.但是大狗当然是C++,它对const的适用范围更广,毫无疑问是你正在寻找的那个.我会避免确定const应该是什么意思,这本身就是一个虫洞,只是谈论"const-ness",即应用const的属性.
const-ness的问题在于需要强制执行.这是C#中的一个问题,当任意其他语言可以使用C#类并完全忽略const-ness只是因为语言不支持它.仅仅因为C#支持它而将其用于其他所有CLS语言当然是非常不切实际的.
可执行性也是C++中的一个问题.因为该语言还支持const_cast <>.任何客户端代码都可以快速且不可抗拒地抛弃常量.你不应该,但有时你必须这样做.因为有两种常量,严格和可观察.大致类似于私人约束和公共约束.稍后将mutable关键字添加到语言中以尝试处理对可观察const的需求,因此至少可以避免使用const_cast <>.有人说C++是一门难懂的语言.不要听到C#的声音.
| 归档时间: |
|
| 查看次数: |
6119 次 |
| 最近记录: |