C#中不可变的局部"变量"

Dou*_*oug 12 c# immutability

我是C#的新手(主要是C++程序员,Java是强大的第二个,而其他一些我不经常使用); 我正在使用C#和Unity,但我有一个似乎与C#相关的问题而不是Unity.

我一直在朝着功能风格的编程方向发展,即代替

// C++
int someFunction(int a) {
    int someCalculatedValue = a * a;
    someCalculatedValue /= 2;
    return someCalculatedValue * 3;
}
Run Code Online (Sandbox Code Playgroud)

我会做这样的事情

// Again C++
int someFunction(int a) {
    const int inputSquared = a * a;
    const int inputSquaredHalved = inputSquared / 2;
    return inputSquaredHalved * 3;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想在C#中做到这一点,但我已经尝试过了

// C#
const float maxGrowth = GrowthRate * Time.deltaTime;
Run Code Online (Sandbox Code Playgroud)

但Mono抱怨说,maxGrowth没有被赋予"常量值" - 所以我假设C#的const关键字实际上相当于来自C++ 11的'constexpr'?

如果是这样,有没有办法在C#中做我想做的事情?最好不要调用一些容器类(除非编译器擅长提高效率?).

我假设从我所读到的内容中,C#在语言方面比C++更接近于Java; 不可变类而不是const-member函数?

Zun*_*Tzu 18

您可以将局部变量声明为迭代变量.迭代变量是只读的.是的,很难看.

foreach (float maxGrowth in new[] { GrowthRate * Time.deltaTime })
{
  maxGrowth = 0; // won't compile: "error CS1656: Cannot assign to 'maxGrowth' because it is a 'foreach iteration variable'"
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,这是一个丑陋的。但有趣的是知道并值得 1up (3认同)

Rob*_*vey 9

readonly

当字段声明包含只读修饰符时,声明引入的字段的赋值只能作为声明的一部分或在同一个类的构造函数中出现.

局部变量没有等价物.你必须把它变成一个领域.

  • 从一开始就有最后一句话吗?我本来可以发誓我之前已经读完了所有内容,但如果没有,请道歉.我不认为"使它成为一个字段"的指导是适用的 - 看一下示例,其中值取决于参数.除非你建议将方法调用转换为自己的类,否则这不是另一种选择. (6认同)
  • 但这不适用于*local*变量,这是OP所要求的. (5认同)
  • OP也没有把它称为常数:)但是明确哪些局部变量可能会改变,哪些可能不是某些函数式语言的确定样式(例如F#).我认为"不,你不能在C#中做到这一点"可能比提及"readonly"更合适. (4认同)
  • **阅读我的整个答案,伙计们。** (2认同)
  • 我以为我清楚了,但无论如何.在Stack Overflow的答案中简单地说"不,你不能"有其自身的问题. (2认同)