Доброго времени суток.
Возникла одна проблемка с Листами. Мне необходимо передать Лист своих классов методу другого класса таким образом, чтобы значение элементов внутри метода менялось, а снаружи оставалось таким же, то есть реализовать класическую передачу по значению, но все мои попытки как-либо сделать это не увенчались успехом: постоянно переходит передача по ссылке.
Приведу простой пример. Консольное приложение.
Есть какой-то класс:
class Class4List
{
public int var;
}
И есть другой класс, в метод которого и будет передаваться Лист предыдущих классов:
class Class4Method
{
public void changeVar(List<Class4List> c4l)
{
c4l[0].var = 1;
}
}
Мэйн:
static void Main(string[] args)
{
List<Class4List> test = new List<Class4List>(); //создаём Лист наших классов
Class4List qwer = new Class4List(); //создаём экземпляр такого же класса
qwer.var = 25; //в нём присваиваем какое-то значение члену класса
test.Add(qwer); //добавляем в наш Лист
Class4Method tst = new Class4Method(); //создаём экземпляр класса с методом, которому нужен Лист
tst.changeVar(new List<Class4List>(test)); //и вызываем этот метод, передавая ему копию нашего Листа
}
В результате и у test[0].var будет значение 1, и у qwer.var тоже, что говорит о том, что значение элементов Листа передаётся по ссылке. Как передать их по значению?
Re: Передача List<> по значению
От:
Аноним
Дата:
16.11.07 23:20
Оценка:
Здравствуйте, Invisible_Kid, Вы писали:
I_K>Доброго времени суток. I_K>Возникла одна проблемка с Листами. Мне необходимо передать Лист своих классов методу другого класса таким образом, чтобы значение элементов внутри метода менялось, а снаружи оставалось таким же, то есть реализовать класическую передачу по значению, но все мои попытки как-либо сделать это не увенчались успехом: постоянно переходит передача по ссылке. I_K>Как передать их по значению?
Вручную клонировать(сделать полную копию) всей коллекции. Можно сериализовать-десериализовать.
Здравствуйте, Invisible_Kid, Вы писали:
I_K>... Мне необходимо передать Лист своих классов методу другого класса таким образом, чтобы значение элементов внутри метода менялось, а снаружи оставалось таким же, ... I_K>
I_K>static void Main(string[] args)
I_K>{
I_K> List<Class4List> test = new List<Class4List>(); //создаём Лист наших классов
I_K> Class4List qwer = new Class4List(); //создаём экземпляр такого же класса
I_K> qwer.var = 25; //в нём присваиваем какое-то значение члену класса
I_K> test.Add(qwer); //добавляем в наш Лист
I_K> Class4Method tst = new Class4Method(); //создаём экземпляр класса с методом, которому нужен Лист
I_K> tst.changeVar(new List<Class4List>(test)); //и вызываем этот метод, передавая ему копию нашего Листа
I_K>}
I_K>
I_K>В результате и у test[0].var будет значение 1, и у qwer.var тоже, что говорит о том, что значение элементов Листа передаётся по ссылке. Как передать их по значению?
Вам нужно сделать копию элементов коллекции, поля и свойства которых вы хотите изменять, не изменяя оригиналы.
В Вашем гипотетическом случае:
static void Main(string[] args)
{
List<Class4List> test = new List<Class4List>(); //создаём Лист наших классов
Class4List qwer = new Class4List(); //создаём экземпляр такого же класса
qwer.var = 25; //в нём присваиваем какое-то значение члену класса
test.Add(qwer); //добавляем в наш Лист
Class4Method tst = new Class4Method(); //создаём экземпляр класса с методом, которому нужен Лист
tst.changeVar(new List<Class4List>(new List<Class4List>(test))); //и вызываем этот метод, передавая ему копию нашего Листа
}
Здравствуйте, Konstantin.Nizhegorodov, Вы писали:
KN>Вам нужно сделать копию элементов коллекции, поля и свойства которых вы хотите изменять, не изменяя оригиналы. KN>В Вашем гипотетическом случае: KN> tst.changeVar(new List<Class4List>(new List<Class4List>(test))); //и вызываем этот метод, передавая ему копию нашего Листа
Всё равно передача происходит по ссылке. И значение test[0].var равно единице.
Пробовал ArrayList — та же проблема.
А вот со стандартными типами работет нормально. То есть, если вместо List<Class4List> в этом случае использовать List<int>, то передача будет по значению, а не по ссылке.
Invisible_Kid пишет: > А вот со стандартными типами работет нормально. То есть, если вместо > List<Class4List> в этом случае использовать List<int>, то передача будет > по значению, а не по ссылке.
List<Structure4List>
?
Posted via RSDN NNTP Server 2.1 beta
Всё, что нас не убивает, ещё горько об этом пожалеет.
Здравствуйте, Invisible_Kid, Вы писали:
I_K>Всё равно передача происходит по ссылке. И значение test[0].var равно единице. I_K>Пробовал ArrayList — та же проблема. I_K>А вот со стандартными типами работет нормально. То есть, если вместо List<Class4List> в этом случае использовать List<int>, то передача будет по значению, а не по ссылке.
Hint: int — value type, Class4List — reference type.
Как уже намекнул рядом Ромашка — дело не в коллекциях, а в типах элементов (в данном случае Class4List). Или используйте структуры или в ручную делайте клонирование элементам.
Здравствуйте, Invisible_Kid, Вы писали:
I_K>Здравствуйте, Аноним, Вы писали:
А>>Вручную клонировать(сделать полную копию) всей коллекции. Можно сериализовать-десериализовать.
I_K>Ручное поэлементное (если я Вас правильно понял) копирование не помогает. Результат тот же.