40

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

就像在 Java 中一样,您可以执行以下操作:

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

如何在 C# 中做同样的事情?我试过了readonlyconst但似乎没有一个工作。

任何帮助将不胜感激。

谢谢。

4

7 回答 7

24

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

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

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

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

于 2010-01-13T06:03:37.140 回答
18

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

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'"
  }
}
于 2014-12-19T16:34:38.990 回答
7

我不确定为什么readonly并且const对您不起作用,因为这些是您需要的关键字。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字段可以是静态的或实例的。

于 2010-01-13T06:02:11.137 回答
4

有一种解决方法需要 ReSharper。您无法获得只读本地人,但您至少可以检测到变异的本地人并为它们着色。

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

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

于 2017-03-27T22:34:16.593 回答
4

截至 2018 年 10 月 2 日,在 c# 中不可能有一个只读的本地,但有一个关于该功能的开放提案正在讨论中。

本文提供了一个有用的总结。

于 2018-10-02T19:01:45.643 回答
1

在您给出的示例中,您需要将变量声明为static,因为您正在使用方法调用对其进行初始化。如果你用一个常数值初始化,比如 42,你可以使用const. 对于类、结构和数组,readonly应该可以工作。

于 2010-01-13T06:04:11.040 回答
0

const 关键字用于修改字段或局部变量的声明。

来自MSDN

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

于 2010-01-13T06:02:21.403 回答