不可变局部'变量'在c#

本文关键字:变量 不可变局 | 更新日期: 2023-09-27 18:10:19

我是c#的新手(主要是c++程序员,其次是Java,其他一些我不太常用);我正在使用c#与Unity,但我有一个问题,似乎是c#相关,而不是Unity。

我一直倾向于函数式编程风格,即,而不是

// C++
int someFunction(int a) {
    int someCalculatedValue = a * a;
    someCalculatedValue /= 2;
    return someCalculatedValue * 3;
}

我会这样做

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

现在,我想在c#中这样做,但我已经尝试过这个

// C#
const float maxGrowth = GrowthRate * Time.deltaTime;

但是Mono抱怨说maxGrowth没有被分配一个"常量"-所以我假设c#的const关键字实际上相当于c++ 11中的"constexpr"?

如果是这样,有没有一种方法可以在c#中做我想做的事情?最好不要调用某些容器类(除非编译器擅长使其高效?)。

我认为从我读到的c#在语言上比c++更接近Java;不可变类而不是const成员函数?

不可变局部'变量'在c#

您可以将本地变量声明为迭代变量。迭代变量是只读的。是的,它很丑。

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'"
}

局部变量没有等价的:声明为一个字段

readonly

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

对于这种情况,我认为更好的方法是使用statement

示例:

using (var font = new Font("Arial", 10.0f)) 
{
    byte charset = font.GdiCharSet;
}

字体变量不可变

参考:

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement