AlexZaharow
@AlexZaharow
O Keep Clear O

Скрыть область видимости переменной?

Всем привет.

Из области "хочу". Хочу в методе/функции скрыть переменную из объявленной ранее в коде.

int i=0;
.
.
.
for(int j=0; j<=N; j++){
    // Вот тут хочу, чтобы i была не видна и я получал ошибку компиляции.
    // Очевидно, что я хочу использовать в качестве индекса массива переменную "j",
    // но из-за того, что применил copy-paste мог не заметить.
    if(elem[i]==null){
    }
}

// Тут нужно вернуть "видимость" i.


Понимаю, что немного перебор, но вдруг есть решение или даже костыль?

P.S.
Вынос кода в другую функцию не предлагать )))
  • Вопрос задан
  • 146 просмотров
Пригласить эксперта
Ответы на вопрос 5
mindtester
@mindtester Куратор тега C#
https://youtu.be/UtO6HIp1908?list=RDUtO6HIp1908
в заданном наборе требований решения нет
Ответ написан
lexxpavlov
@lexxpavlov
Программист, преподаватель
Переменную можно поместить в блок, тогда переменная будет ограничена только этим блоком:
int Test()
{
    int result = 0;

    {
        int i = 10;
        for (int j = 0; j < 10; j++)
        {
            result += i;
        }
    }
    {
        string i = "xyz";
        Console.WriteLine(i);
    }
    return result;
}
Ответ написан
@sttrox
Одним из вариантов может быть удаление переменной i.
После удаления будут подсвечены все использования переменной i
Ответ написан
GavriKos
@GavriKos
Вынести цикл в отдельный метод.
Ответ написан
lam0x86
@lam0x86
Можно написать Code Analyzer, который будет выдавать ошибку компиляции в случае использовании переменной внутри блока, помеченного каким-либо способом, например специальным комментарием с именами запрещенных переменных:

int i = 0;
// HIDE: i
for(int j=0; j<=N; j++) {
  if(elem[i]==null) { // Ошибка компиляции: использование запрещённой переменной.
  }
}
// SHOW: i
i++; // Нет ошибки.


или блоком using:
int i = 0;
using (CompilerUtils.HideVar(i))
{
  for(int j=0; j<=N; j++){
    if(elem[i]==null) { // Ошибка компиляции: использование запрещённой переменной
    }
  }
}
i++; // OK.


Сам код HideVar может не делать ничего:
public static class CompilerUtils
{
  public static IDisposable HideVar(params object[] vars)
  {
    return <пустая реализация IDisposable>;
  }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы