Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > фигня с передачей параметров в метод


Автор: 4YBAK 10.3.2006, 19:50
Проблема в том, что метод с какого-то х*на в результате своей работы меняет исходные значения в матрице RG. Хотя значение в него передается бай валуе, и исходная матрица меняться не должна.

Код

Z=Metod(RG,P,5); // вызов метода Metod
//
//
//
public  double[]  Metod(double[,] RG,double[] P,int n) //Это сам метод, принимающий матрицу дабл, массив дабл, и число инт. Возвращает он массив дабл.
{}


Т.е. работает так, как если б я написал
Код

Z=Metod(ref RG,P,5);  
public  double[]  Metod(ref double[,] RG,double[] P,int n)


Автор: Ch0bits 10.3.2006, 23:09
Исходники давай. smile

Автор: mr.DUDA 10.3.2006, 23:10
Цитата(4YBAK @ 10.3.2006, 18:50 Найти цитируемый пост)
Хотя значение в него передается бай валуе, и исходная матрица меняться не должна.

Почему "by value" ? Аргументы, являющиеся ссылочными типами, ВСЕГДА передаются по ссылке (даже если не указан модификатор ref). А массив - это ссылочный тип.

Автор: 4YBAK 11.3.2006, 00:06
Цитата(mr.DUDA @ 10.3.2006, 23:10 Найти цитируемый пост)
Аргументы, являющиеся ссылочными типами, ВСЕГДА передаются по ссылке (даже если не указан модификатор ref)


Мега полезный форум!!! Стоко нового узнаю!
Дак как же мне передать массив не по ссылке, а по значению... Чтоб исходную матрицу не затереть?
Не, можно конечно городить огород, типа просто завести еще матрицу RGSAVE, и зафигарить в нее значения из матрицы RG. RG затрется, RGSAVE останется. Но может есть способ проще?

Кстати, не решится ли проблема, если поменять переменную RG в методе Metod на какую-нить другую?
Т.е. заменить
public double[] Metod(double[,] RG,double[] P,int n)
на
public double[] Metod(double[,] RG1,double[] P,int n)






Автор: Exception 11.3.2006, 00:35
А какие проблемы-то smile ? Просто работай с копией. По поводу второго вопроса - бред, от названия ничего не зависит.

Автор: Illuminaty 11.3.2006, 00:40
Вызывай так:
Код

Z = Metod((double[,])RG.Clone(), (double[])P.Clone(), 5)

Удачи!

Автор: 4YBAK 11.3.2006, 00:51
Цитата(Illuminaty @ 11.3.2006, 00:40 Найти цитируемый пост)
Вызывай так:
Z = Metod((double[,])RG.Clone(), (double[])P.Clone(), 5)
Удачи!

Супер! Благодарю! Вот такого ответа я и ждал smile


Автор: Exception 11.3.2006, 02:16
А ты как думал smile ? При присваиваний одного ссылочного объекта другому присваивается ссылка. То есть при изменении одного меняется и другой. Если тебе необходимо получить именно копию, надо воспользоваться методом Clone (если реализован интерфейс ICloneable) или MemberwiseClone (это уж совсем извращение, копирует поля объекта).

Автор: 4YBAK 11.3.2006, 03:32
Цитата(Exception @ 11.3.2006, 02:16 Найти цитируемый пост)
Если тебе необходимо получить именно копию, надо воспользоваться методом Clone (если реализован интерфейс ICloneable)


У меня ниче нигде не реализовано, а код Z = Metod((double[,])RG.Clone(), (double[])P.Clone(), 5) работает smile
Или ICloneable по умолчанию реализуется? smile

Автор: Exception 11.3.2006, 11:51
Не ты его должен реализовывать, а объект, который тебе хочется скопировать. То есть в данном случае массив реализует ICloneable. Советую всё-таки прежде чем начинать что-то писать, почитать хорошую литературу (например, Троелсена).

Автор: 4YBAK 11.3.2006, 18:47
Цитата(Exception @ 11.3.2006, 11:51 Найти цитируемый пост)
Советую всё-таки прежде чем начинать что-то писать, почитать хорошую литературу (например, Троелсена).


Уже давно прочитал smile
Ниче из того, что он писал про интерфейсы, я не понял smile
Уж очень фсе про них теоретически....


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)