如何在C#中声明一个局部常量?

时间:2010-01-13 05:58:37

标签: c# immutability readonly local-variables

如何在C#中声明局部常量?

与Java一样,您可以执行以下操作:

public void f(){
  final int n = getNum(); // n declared constant
}

如何在C#中做同样的事情?我尝试使用readonlyconst,但似乎都没有。

非常感谢任何帮助。

感谢。

7 个答案:

答案 0 :(得分:21)

在C#中,您无法创建从方法中检索的常量。

编辑:死链接 <击> http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx

此文档应该有所帮助: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/const

  

常量表达式是一个可以在中完全计算的表达式   编译时间。

答案 1 :(得分:12)

将您的局部变量声明为迭代变量。迭代变量是只读的 (你没有要求一个漂亮的解决方案)。

public void f() 
{
  foreach (int n in new int[] { getNum() }) // n declared constant
  {
    n = 3; // won't compile: "error CS1656: Cannot assign to 'n' because it is a 'foreach iteration variable'"
  }
}

答案 2 :(得分:6)

我不确定为什么readonlyconst不适合您,因为这些是您需要的关键字。如果您有文字(数组文字除外)和const,则使用readonly

public void f()
{
    const int answer = 42;
}

private readonly int[] array = new int[] { 1, 2, 3, 4 };
private readonly DateTime date = DateTime.Now;
public void g()
{
    Console.WriteLine(date.ToString());   
}

readonly仅适用于类级别(即,您只能将其应用于字段)。同样由于const需要文字,它本身就是静态的,而readonly字段可以是静态的或实例。

答案 3 :(得分:3)

有一种需要ReSharper的解决方法。你无法获得只读的本地人,但你至少可以检测到变异的并用不同的颜色进行着色。

使用字体和颜色项 Resharper Mutable Local Variable Identifier

对我来说,我的本地人是灰色的,然后我为变异的变量选择了一个大胆的白色(这是一个黑暗的主题)。这意味着,与常规变量相比,任何写入多次的变量都会显示出明亮的变化。然后,您可以尽力避免使用变异变量,或者如果方法确实需要变量,那么它至少会被突出显示。

答案 4 :(得分:2)

从2018年10月2日起,在c#中不可能有只读的本地语言,但是该功能有一个开放的proposal,该功能正在进行discussion

article提供了有用的摘要。

答案 5 :(得分:1)

在您给出的示例中,您需要将变量声明为static,因为您正在使用方法调用对其进行初始化。如果使用常量值(如42)进行初始化,则可以使用const。对于类,结构和数组,readonly应该有效。

答案 6 :(得分:0)

  

const关键字用于修改a   宣布一个领域或当地   变量

来自MSDN

因为无论如何C#都不能强制执行“const correctnes”(比如c ++),我认为它不是很有用。由于功能范围非常窄,因此很容易失去监督。