【发布时间】:2010-06-03 17:12:13
【问题描述】:
我怀疑 const 已针对 C# 规范进行了简化,以简化通用语言。我们不能像使用 C++ 一样将变量引用或方法声明为 const 是否有特定原因?例如:
const MyObject o = new MyObject(); // Want const cast referenece of MyObject
o.SomeMethod(); // Theoretically legal because SomeMethod is const
o.ChangeStuff(); // Theoretically illegal because ChangeStuff is not const
class MyObject
{
public int val = 0;
public void SomeMethod() const
{
// Do stuff, but can't mutate due to const declaration.
}
public void ChangeStuff()
{
// Code mutates this instance. Can't call with const reference.
val++;
}
}
【问题讨论】:
-
你的意思是,除了“因为 C++ 风格的
constness 具有深远的影响,这些影响真的很难做到正确(从设计和实现 POV)并且没有运行时支持“?这是一个有用但非常昂贵的功能。 FWIW,F# 采用相反的方法:Nothing 是可变的,除非这样声明。不过,与框架的交互可能并不明显。 -
我不同意这是完全重复的。老问题询问如何在代码中实现这一点。 @spoulson 询问为什么它不在编译器中。
-
需要强制执行常量正确性才有意义。当任何支持 .NET 的语言都可以使用由另一种语言创建的类型时,这变得很困难。大概有近百个。所有这些语言的语法都必须修改以适应声明 const 属性,并调整它们的编译器以验证它们。换句话说,const 正确性完全不符合 CLS。
-
@HansPassant:指示结构方法和属性是否影响底层结构的属性即使没有强制执行也会很有用,因为它们可以告诉编译器哪些方法和属性应该在只读结构上可用.此外,即使一种语言不支持 const 正确性,如果供应商或接收者不能保证不需要它,JITter 可以通过制作结构的防御性副本来强制执行它,但如果供应商双方都省略复制操作并且收件人可以被验证为不需要它。