【问题标题】:Why wasn't C# designed with 'const' for variables and methods? [duplicate]为什么 C# 没有为变量和方法设计“const”? [复制]
【发布时间】:2010-06-03 17:12:13
【问题描述】:

可能重复:
“const correctness” in C#

我怀疑 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 可以通过制作结构的防御性副本来强制执行它,但如果供应商双方都省略复制操作并且收件人可以被验证为不需要它。

标签: c# constants


【解决方案1】:

无论在何处使用,const 都会执行值的编译时替换,因此没有任何运行时含义。一般来说,编译器很难确定您为 const 对象提出的建议(方法是否会修改对象)。您使用 const 关键字作为访问修饰符的建议也会给编写者带来负担,并且您仍然面临验证某事是否修改对象的问题。此外,您还对对象施加了在所有情况下都没有意义的东西。如果方法是 const 但您没有将其用作 const 对象,这意味着什么?您想要的功能通常是通过实现一个接口并仅公开类的“只读”部分来实现的。

【讨论】:

    【解决方案2】:

    我怀疑你问题的第一句话回答了它。

    【讨论】:

      【解决方案3】:

      我相信您可以在 C# 中将变量声明为 conststatic 也可以,如果你觉得有需要的话。

      http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx

      【讨论】:

      • 只有 C# 中的原始类型(和string)可以声明为const
      猜你喜欢
      • 2011-05-08
      • 2020-07-11
      • 2014-05-18
      • 2013-12-17
      • 2017-10-18
      • 2016-04-06
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多