为什么没有';t C#设计为';常数';对于变量和方法?

为什么没有';t C#设计为';常数';对于变量和方法?,c#,constants,C#,Constants,可能重复: 我怀疑const在C#规范中被简化了,以实现一般语言的简单性。有没有一个特殊的原因,我们不能用C++来声明变量引用或方法,如 const ?e、 g: const MyObject o = new MyObject(); // Want const cast referenece of MyObject o.SomeMethod(); // Theoretically legal because SomeMethod is const o.ChangeStuff();

可能重复:

我怀疑
const
在C#规范中被简化了,以实现一般语言的简单性。有没有一个特殊的原因,我们不能用C++来声明变量引用或方法,如<代码> const <代码>?e、 g:

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#中将变量声明为
const
<代码>静态也可以,如果您觉得需要的话


常量在任何使用它的地方都对值执行编译时替换,因此没有任何运行时意义。通常,编译器很难确定您为常量对象提出的建议(方法是否会修改对象)。您使用const关键字作为访问修饰符的建议也会给编写者带来负担,并且您仍然需要验证是否修改了对象。此外,您正在将某些内容强加给对象,而这些内容在所有上下文中都没有意义。如果方法是const,但您没有将其用作const对象,这意味着什么?您想要的功能通常是通过实现一个接口并只公开类的“只读”部分来实现的。

您的意思是,除此之外,“因为C++风格的
const
ness具有深远的影响,这真的很难做到正确(从设计和实现角度来看),并且没有运行时支持”?这是一个有用但非常昂贵的功能。FWIW,F#采取了相反的方法:没有什么是可变的,除非声明为可变的。不过,与框架的交互可能并不明显。我不同意这是完全重复的说法。老问题是如何在代码中实现这一点@Peoplson询问为什么它不在编译器中。常量正确性需要强制才能有意义。当任何支持.NET的语言都可以使用另一种语言创建的类型时,这就变得很困难了。大概有近百个。所有这些语言的语法都必须修改,以适应声明const属性及其编译器的调整以验证它们。换句话说,const correction是完全不符合CLS的。@HansPassant:用于指示结构方法和属性是否影响基础结构的属性,即使它们没有被强制执行,也是有用的,因为它们可以告诉编译器哪些方法和属性应该在只读结构上可用。此外,即使一种语言不支持const正确性,如果供应商或接收者不能保证不需要,JITter也可以通过制作结构的防御副本来强制执行它,但如果供应商和接收者都可以验证为不需要,则省略复制操作。仅原语类型(和
string
)在C语言中,可以声明
const