我一直在想为什么C#不支持在类或方法级别上使用const
。我知道Jon Skeet长期以来一直希望支持不可变性,并且我认为使用C++函数const语法可能会有所帮助。通过在类级别添加const关键字,我们将拥有完全的支持。
现在,我的问题是,C#团队没有开发此类支持的原因是什么?
我想通过编译时检查或使用属性创建所有内容,而无需更改CLR即可完成。我不介意代码能够通过反射覆盖const行为。
想象一下:
const class NumberContainer
{
public int Number { get; }
}
这样的类只能在构造时进行填充,因此我们需要一个构造函数来接收一个整数参数。
另一个例子是方法级别的 const:
public int AddNumbers(NumberContainer n1, NumberContainer n2) const
{
return n1.Number + n2.Number;
}
在其自身类或传递给它们的引用类型实例中,常量级别方法不应该能够更改状态。此外,在其作用域内,常量级别函数只能调用其他常量级别函数。
我不确定Lambda表达式和委托是否会使一切变得太难(或不可能)实现,但我相信有更多语言和编译器设计经验的人可以告诉我。
正如Steve B在评论中指出的那样,readonly
的存在使事情变得更加复杂,因为在runtime
期间,const和readonly
非常接近,但是readonly
值无法在编译时确定。我想我们可以有const
和readonly
级别,但这可能会太令人困惑了吧?
那么,为什么不实现这个功能呢?是可用性问题(对于新用户来说,理解C++中的常量性通常很困难),语言设计问题(无法完成)还是简单地优先考虑问题(不可变性热潮的日子已经过去了)..?
const
。 - Jodrell