C#中不可变的局部“变量”

时间:2014-06-24 20:59:47

标签: c# immutability

我是C#的新手(主要是C ++程序员,Java是强大的第二,而其他一些我经常使用);我在Unity中使用C#,但我有一个似乎与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关键字实际上等同于' constexpr'来自C ++ 11?

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

我认为从我所读到的C#中,C语言在语言上比C ++更接近于Java;不可变类而不是const-member函数?

3 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:10)

readonly

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

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

答案 2 :(得分:-1)

我相信这种情况的更好方法是使用语句

示例:

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

font变量是不可变的

参考:

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