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

mis*_*tor 31 c# local-variables readonly immutability

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

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

public void f(){
  final int n = getNum(); // n declared constant
}
Run Code Online (Sandbox Code Playgroud)

如何在C#中做同样的事情?我试着用readonlyconst,但没有一个似乎工作.

任何帮助将不胜感激.

谢谢.

Eri*_*ang 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

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

  • 好吧,那很糟糕.:/ (17认同)
  • 野蛮.我不仅应该得到支持,它应该是默认的. (6认同)
  • `final`和`const`有不同的含义.在C#中,必须在编译时知道`const`值.真正的问题是C#不支持本地`readonly`变量,这太糟糕了,因为它们很方便. (2认同)

Zun*_*Tzu 13

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

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'"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 很高兴知道,但上帝保证,不会那样做. (8认同)
  • 这是金色的)这个黑客是如此丑陋我甚至没有想到它.我肯定会使用它(作为代码片段)来检查我的代码,你知道,暂时将`var index = GetNum()`更改为`foreach`以强制编译器检查我的代码. (2认同)

Tam*_*ege 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());   
}
Run Code Online (Sandbox Code Playgroud)

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

  • **你的**问题的答案很简单 - 它们(const,readonly)都不适用于给定的例子. (3认同)
  • 重要的是要注意,创建引用类型的只读实例只意味着引用本身不能更改; 仍然可以正常修改对象(除非类型是不可变的,如String). (2认同)

afk*_*afk 6

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

本文提供有用的总结。