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

如何在C#中声明局部常量?,c#,immutability,readonly,local-variables,C#,Immutability,Readonly,Local Variables,如何在C#中声明局部常量 与Java一样,您可以执行以下操作: public void f(){ final int n = getNum(); // n declared constant } 在C#中如何做同样的事情?我尝试了readonly和const,但似乎都不起作用 任何帮助都将不胜感激 谢谢。我不知道为什么只读和常量不适合您,因为这些是您需要的关键字。如果您有一个文本(数组文本除外),则使用const,否则使用readonly: public void f() { co

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

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

public void f(){
  final int n = getNum(); // n declared constant
}
在C#中如何做同样的事情?我尝试了
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
字段可以是静态的,也可以是实例

const关键字用于修改 字段或本地字段的声明 变数


由于C#无论如何都不能强制执行“const correctnes”(比如C++),我认为它不是很有用。由于函数的作用域非常窄,因此很容易忽略。

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

编辑:死链接

这份文件应该有助于:

常量表达式是一个可以在 编译时


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

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


有一种解决方法需要重新harper。你不能得到只读的局部变量,但你至少可以检测到变异的局部变量,并对它们进行不同的着色

使用字体和颜色项Resharper可变局部变量标识符


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

从2018-10-02起,在c#中不可能有只读的局部变量,但该功能仍在继续



这提供了一个有用的摘要。

请注意,您不能对变量使用静态,只能对成员使用静态。需要注意的是,创建引用类型的只读实例只意味着引用本身无法更改;对象仍然可以正常修改(除非类型是不可变的,比如字符串)。您的问题的答案很简单——它们中的任何一个(const,readonly)在给定的示例中都不起作用。但是,我必须指出,eric dahlvang仍然正确地解释了为什么const在您的示例中不起作用。C++ C++和java等其他语言,如C++和java等语言提供了这样的机制,不知道Java,但C++也能在引用上实现真正的const,C语言不能。我从未见过任何地方在C++中使用的任何地方都是const。因为函数非常像Navuly,容易忽略掉。”-不正确。尽可能多地使用常数实际上是函数编程的一个主要特征。——“我从来没有看到过CONST在任何地方都比C++使用的”。当我在编程C++时,我一直使用<代码> const 。参数,返回值,局部变量。我声明的const的所有声明。我不能同意它没有用的说法。事实上,它是非常有用的。如果我看到一个局部const变量,我马上就会知道我不会感到惊讶。这是最令人讨厌的可读性。这是我在短时间内使用C语言最恼人的遗漏。我一直使用C++中的局部变量来保证我自己的安全性、理智性和可读性。@ MauricioScheffer,谢谢链接。虽然现在我必须为.NET写一些东西,但我肯定会使用F。romise,永远不会那样做。这真是太棒了)这个黑客太难看了,我甚至都没想过。我肯定会用它(作为一个片段)来检查我的代码,你知道,临时更改
var index=GetNum()
to
foreach
强制编译器检查我的code.omg。当我认真考虑使用这个黑客时,我仍然在桌子上磕头。真是一个肮脏的家伙;-)好吧,那太糟糕了。:/craudit。我不仅应该被支持,它应该是默认值。
final
const
有不同的含义。在C中,a const 值必须在编译时知道。真正的问题是C不支持本地<代码> Read Ont/Cux>变量,这太糟糕了,因为它们很方便。@ Nick,在C++中,不必在编译时知道本地const。它对我来说不起作用。它只显示循环计数器是不可变的,其他都是μ。表,无论写入多少次。我猜我的重竖琴器太旧了:-)@Xan KunClark Davis它不显示什么是可变的,它显示什么是变异的。任何只写入一次的都会看起来正常。任何写入两次或更多的都会突出显示。(哦,我猜你说的是“无论写入多少次”).你确定吗?像
int x=5;x=3;
,x应该改变颜色。我想可能是版本,是的。@Sahuagin是的,我得到的部分是,你必须反转它,所有的局部变量都得到了highlightet,所有的可变变量都得到了“normalized”“再一次,但它仍然不会改变颜色。我会再次尝试一个干净的项目。好的,我打开了一个新的工作区,再次尝试,它成功了!真正的魔法:-)唯一的一点是,我不知道有一个行为是什么。”
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'"
  }
}