Передача List<> по значению
От: Invisible_Kid  
Дата: 16.11.07 23:05
Оценка:
Доброго времени суток.
Возникла одна проблемка с Листами. Мне необходимо передать Лист своих классов методу другого класса таким образом, чтобы значение элементов внутри метода менялось, а снаружи оставалось таким же, то есть реализовать класическую передачу по значению, но все мои попытки как-либо сделать это не увенчались успехом: постоянно переходит передача по ссылке.
Приведу простой пример. Консольное приложение.
Есть какой-то класс:
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>Как передать их по значению?

Вручную клонировать(сделать полную копию) всей коллекции. Можно сериализовать-десериализовать.
Re: Передача List<> по значению
От: Konstantin.Nizhegorodov Россия  
Дата: 16.11.07 23:22
Оценка:
Здравствуйте, 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))); //и вызываем этот метод, передавая ему копию нашего Листа
}
Re[2]: Передача List<> по значению
От: Invisible_Kid  
Дата: 17.11.07 09:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вручную клонировать(сделать полную копию) всей коллекции. Можно сериализовать-десериализовать.


Ручное поэлементное (если я Вас правильно понял) копирование не помогает. Результат тот же.
Re[2]: Передача List<> по значению
От: Invisible_Kid  
Дата: 17.11.07 09:41
Оценка:
Здравствуйте, Konstantin.Nizhegorodov, Вы писали:

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

KN>В Вашем гипотетическом случае:
KN> tst.changeVar(new List<Class4List>(new List<Class4List>(test))); //и вызываем этот метод, передавая ему копию нашего Листа

Всё равно передача происходит по ссылке. И значение test[0].var равно единице.
Пробовал ArrayList — та же проблема.
А вот со стандартными типами работет нормально. То есть, если вместо List<Class4List> в этом случае использовать List<int>, то передача будет по значению, а не по ссылке.
Re[3]: Передача List<> по значению
От: Ромашка Украина  
Дата: 17.11.07 14:43
Оценка:
Invisible_Kid пишет:
> А вот со стандартными типами работет нормально. То есть, если вместо
> List<Class4List> в этом случае использовать List<int>, то передача будет
> по значению, а не по ссылке.

List<Structure4List>

?
Posted via RSDN NNTP Server 2.1 beta


Всё, что нас не убивает, ещё горько об этом пожалеет.
Re[3]: Передача List<> по значению
От: Curufinwe Украина  
Дата: 17.11.07 23:14
Оценка: +1
Здравствуйте, Invisible_Kid, Вы писали:

I_K>Всё равно передача происходит по ссылке. И значение test[0].var равно единице.

I_K>Пробовал ArrayList — та же проблема.
I_K>А вот со стандартными типами работет нормально. То есть, если вместо List<Class4List> в этом случае использовать List<int>, то передача будет по значению, а не по ссылке.

Hint: int — value type, Class4List — reference type.

Как уже намекнул рядом Ромашка — дело не в коллекциях, а в типах элементов (в данном случае Class4List). Или используйте структуры или в ручную делайте клонирование элементам.
Re[3]: Передача List<> по значению
От: Ватакуси Россия  
Дата: 19.11.07 12:01
Оценка:
Здравствуйте, Invisible_Kid, Вы писали:

I_K>Здравствуйте, Аноним, Вы писали:


А>>Вручную клонировать(сделать полную копию) всей коллекции. Можно сериализовать-десериализовать.


I_K>Ручное поэлементное (если я Вас правильно понял) копирование не помогает. Результат тот же.


Значит неверно копируешь. Покажи код.
Все будет Украина!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.