Как перебирать переменные по ссылке c # - PullRequest
0 голосов
/ 23 ноября 2018

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

int _var1;
int _var2;
int _var3;

List<int> varList = new List<int>() { _var1, _var2, _var3 };
for (int i = 0; i < varList.Count; i++) 
{
    varList[i]++;
}

Как-то так не работает.

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

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

вы можете создать класс и поместить в него ваши Var1, Var2 и Var3, а также инициализировать и обьектировать их и вызывать их в цикле.

как-то так.

List<MyClass> obj_list = get_the_list();

foreach( MyClass obj in obj_list ){ obj.property = 42;}
0 голосов
/ 23 ноября 2018

Это просто, как работают типы значений.Бокс не поможет или

Из спецификации 1.3 Типы и переменные

Когда значение типа значения преобразуется в объект типа, экземпляр объекта такженазывается «ящик», выделяется для хранения значения, и значение копируется в этот ящик.И наоборот, когда ссылка на объект приводится к типу значения, выполняется проверка того, что указанный объект является блоком правильного типа значения, и, если проверка прошла успешно, значение в поле копируется.

  • Вам нужно будет сохранить их в ссылочном типе
  • , иначе можно использовать массив указателей (int*).(Предполагается, что массив подходит), это позволило бы функциональным преобразованиям без необходимости заключать их в другой тип

Пример

private int _var1 = 1;
private int _var2 = 2;
private int _var3 = 3;

...

var varList = new[] { &_var1, &_var2, &_var3 };

...

foreach (var value in varList)
   *value += 1;

Console.WriteLine(_var1);
Console.WriteLine(_var2);
Console.WriteLine(_var3);

Вывод

2
3
4

Дополнительные ресурсы

0 голосов
/ 23 ноября 2018

Типы значений копируются при добавлении их в Список.List выделяет разную память.

Даже если побочные эффекты лучше не использовать, функция должна возвращать Tuple значений, и вы устанавливаете их явно.

Если вы хотите передатьих по ссылке нужно завернуть в объект:

    public class ValueStorage
    {
        public int Value { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var _var1 = new ValueStorage() { Value = 0 };
            var _var2 = new ValueStorage() { Value = 1 };
            var _var3 = new ValueStorage() { Value = 2 };

            var varList = new List<ValueStorage> { _var1, _var2, _var3 };
            for (int i = 0; i < varList.Count; i++)
            {
                varList[i].Value++;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...