Неизменяемые локальные "переменные" в C#

Я новичок в 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 не присваивается "постоянное значение" - поэтому я предполагаю, что ключевое слово const C#фактически эквивалентно "constexpr" из C++11?

Если да, есть ли способ сделать то, что я хочу в C#? Предпочтительно без вызова некоторого класса контейнера (если компилятор не хорош в том, чтобы сделать это эффективным?).

Я предполагаю, что из того, что я прочитал, C# намного ближе к Java в целом, чем C++ в языке; неизменяемые классы, а не функции-члены const?

2 ответов


readonly

когда объявление поля включает модификатор readonly, назначения полям, введенным объявлением, могут происходить только как часть объявления или в конструкторе в том же классе.

нет эквивалента для локальных переменных. Тебе придется сделать из этого поле.


можно объявить локальную переменную как переменную итерации. Переменные итерации только для чтения. Да, это уродливо.

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