Как изменить значение одного поля в структуре, которая находится в массиве структур?
Имеется структура "Test", в ней имеется строковое поле "Name". Так же имеется массив структур "ArrayTest", который наполнен структурами "Test", проблема в том, что при прохождении по данному массиву структур я изменяю поле "Name", передавая структуру по ссылке, но при следующем проходе все поля "Name" изначальные, то есть имеют значения, которые я присвоил при инициализации. Как можно обойти данную ситуацию?
public struct Test
{
public String Name;
public Test(String name)
{
this.Name = name;
}
}
public Class A
{
Test[,] ArrayTest;
static void Main(string[] args)
{
int column = 0, row = 0;
for(int i = 0; i<10; i++)
{
for(int j = 0; j<10; j++)
{
ArrayTest[column, row] = new Test("a");
column++;
}
row++;
column = 0;
}
foreach (var t in ArrayTest)
SetName(ref t, "b");
foreach (var t in ArrayTest)
Console.WriteLine(t.Name); //выводится "a"
}
public void SetName(ref Test t, String n)
{
t.Name = n; //Через отладчик видно, что значение присваивается, т.е. t.Name = "b"
}
}
Ответы (1 шт):
Структуры - это value type. Они присваиваются по значению, полным копированием. Вот в этой строчке:
foreach (var t in ArrayTest)
вы получаете в переменной t копию структуры из массива.
Компилятор причем на это явно ругается:
CS1657 Cannot use 't' as a ref or out value because it is a 'foreach iteration variable'
Замените цикл на for и передавайте ссылку на структуре в массиве, а не на копию:
static void Main(string[] args)
{
ArrayTest = new Test[10, 10];
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
ArrayTest[i, j] = new Test("a");
}
}
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
SetName(ref ArrayTest[i, j], "b");
}
}
foreach (var t in ArrayTest)
Console.WriteLine(t.Name); //выводится "a"
}