Как объявить локальную константу в C #? - PullRequest
28 голосов
/ 13 января 2010

Как объявить локальную константу в C #?

Как и в Java, вы можете сделать следующее:

public void f(){
  final int n = getNum(); // n declared constant
}

Как сделать то же самое в C #? Я пробовал с readonly и const, но, похоже, ничего не работает.

Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 7 ]

21 голосов
/ 13 января 2010

В C # нельзя создать константу, полученную из метода.

Редактировать: мертвая ссылка http://msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx

Этот документ должен помочь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/const

Постоянное выражение - это выражение, которое может быть полностью оценено в время компиляции.

12 голосов
/ 19 декабря 2014

Объявите вашу локальную переменную как переменную итерации. Переменные итерации доступны только для чтения (Вы не просили красивое решение).

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'"
  }
}
6 голосов
/ 13 января 2010

Я не уверен, почему 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 может быть статическим или экземпляром.

3 голосов
/ 28 марта 2017

Существует своего рода обходной путь, который требует ReSharper. Вы не можете получить только для чтения местных жителей, но вы можете, по крайней мере, обнаружить мутированных и покрасить их по-разному.

Использование элемента «Шрифты и цвета» Resharper Mutable Local Variable Identifier .

Для меня у местных жителей есть серый цвет, а затем я выбрал жирный белый цвет для мутированных переменных (это с темной темой). Это означает, что любая переменная, которая записана более одного раза, отображается ярче по сравнению с обычными. Затем вы можете сделать все возможное, чтобы избежать наличия мутированной переменной, или, если метод действительно требует ее, она будет по крайней мере выделена.

2 голосов
/ 02 октября 2018

По состоянию на 2018-10-02, в c # невозможно иметь локальный доступ только для чтения, но есть открытое предложение для этой функции, в которой продолжается обсуждение .

Эта статья содержит полезную сводку.

1 голос
/ 13 января 2010

В приведенном вами примере вам нужно объявить переменную как static, потому что вы инициализируете ее вызовом метода. Если вы инициализировали с постоянным значением, например, 42, вы можете использовать const. Для классов, структур и массивов readonly должно работать.

0 голосов
/ 13 января 2010

Ключевое слово const используется для изменения объявление поля или местного переменная.

С MSDN .

Так как C # в любом случае не может принудительно применять «const correctnes» (как c ++), я не думаю, что это очень полезно. Поскольку функции очень ограничены, легко не потерять надзор.

...