Z
Z
Zakharov Alexander2018-10-25 18:11:48
C++ / C#
Zakharov Alexander, 2018-10-25 18:11:48

Hide variable scope?

Hello.
From the "want". I want to hide a variable in a method/function from the one declared earlier in the code.

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

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

I understand that it's a bit overkill, but what if there is a solution or even a crutch?
PS
Do not suggest moving the code to another function)))

Answer the question

In order to leave comments, you need to log in

5 answer(s)
#
#, 2018-10-25
@mindtester

there is no solution in the given set of requirements

A
Alexey Pavlov, 2018-10-26
@lexxpavlov

A variable can be placed in a block, in which case the variable will be restricted to that block only:

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;
}

S
sttrox, 2018-10-25
@sttrox

One option would be to remove the i variable.
After deletion, all uses of the variable i will be highlighted

G
GavriKos, 2018-10-25
@GavriKos

Move the loop to a separate method.

L
lam0x86, 2018-11-01
@lam0x86

It is possible to write a Code Analyzer that will generate a compilation error if a variable is used inside a block that is marked in some way, such as a special comment with names of forbidden variables:

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

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

The HideVar code itself may not do anything:
public static class CompilerUtils
{
  public static IDisposable HideVar(params object[] vars)
  {
    return <пустая реализация IDisposable>;
  }
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question