powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Изменить массив по ссылке
17 сообщений из 17, страница 1 из 1
Изменить массив по ссылке
    #39031023
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как в моем случае можно изменить массив, передавая его по ссылке?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
    class Program
    {
        static void Main(string[] args)
        {
            int[] data = null;
            if(data == null)
            {
                Console.WriteLine("Array is null");
            }
            else
            {
                Console.WriteLine(String.Format("Count = {0}", data.Count()));
            }

            // Working...
            MyClass my = new MyClass(ref data);
            my.Work();            
            if (data == null)
            {
                Console.WriteLine("Array is null");
            }
            else
            {
                Console.WriteLine(String.Format("Count = {0}", data.Count()));
            }
        }
    }

    class MyClass
    {
        int[] dataWork = null;
        
        public MyClass(ref int[] data)
        {
            dataWork = data;
        }

        public void Work()
        {
            dataWork = new int[3];
            dataWork[0] = 10;
            dataWork[1] = 20;
            dataWork[2] = 30;
        }
    }
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39031035
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,
А в чем цель и смысл?
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39031037
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1Как в моем случае можно изменить массив, передавая его по ссылке?
ты его не меняешь
хочешь поменять - меняй явно
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39031219
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1Как в моем случае можно изменить массив, передавая его по ссылке?
Можно изменить, что-то присваивая этой ссылке. В вашем коде нигде этого нет.
Вот так консольный вывод сообщит про Count:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
class Program
{
  static void Main()
  {
    int[] data = null;
    var my = new MyClass(ref data);
    Console.WriteLine(data == null ? "Array is null" : string.Format("Count = {0}", data.Count()));
    Console.WriteLine("done");
    Console.ReadKey(true);
  }
}

class MyClass
{
  int[] _dataWork;

  public MyClass(ref int[] data)
  {
    Work();
    data = _dataWork;
  }

  public void Work()
  {
    _dataWork = new int[3];
    _dataWork[0] = 10;
    _dataWork[1] = 20;
    _dataWork[2] = 30;
  }
}


- найдите 10 отличий, и разберитесь, что и зачем тут было изменено.
Но, как выше было сказано, в этом нет смысла - массивы сами по себе являются ссылочным типом, и вполне изменяются при обычной передаче ссылки на массив:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
static void Main()
{
  var data = new [] {1, 2, 3};
  Change(data);
  data.ToList().ForEach(Console.WriteLine);
  Console.WriteLine("done");
  Console.ReadKey(true);
}

static void Change(int[] data)
{
  var rnd = new Random();
  for(var i=0; i<data.Length;i++)
    data[i] = rnd.Next();
}
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39031306
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем и целом мне все понятно. Особенно, когда мы в метод передаем массив (ключевое здесь - по значению) и в этом же методе его меняем. То есть, что по ссылке, что по значению - для массива все одно.
В моем случае есть одно отличие: я передаю массив объекту (в конструкторе) для анализа, а в другом методе этот ранее переданный массив я хочу поменять. Например: создаю форму с ListBox и передаю номера строк, которые надо выделить. А возвращать по ОК хочу выбранные пользователем строки. Cделал через public свойство (в конструкторе присваиваю, потом его анализирую, потом в него же записываю результат и после уже (условно - после закрытия формы) - считываю результат.
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39031383
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1То есть, что по ссылке, что по значению - для массива все одно.


Передавая по ссылке, ты ее можешь изменить в вызываемом методе (myref = new int[]), и тогда она же изменится в вызывающем методе
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39031821
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Код: c#
1.
2.
3.
4.
5.
6.
static void Change(int[] data)
{
  var rnd = new Random();
  for(var i=0; i<data.Length;i++)
    data[i] = rnd.Next();
}


А так?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
   static void Change(int[] data)
        {
            var rnd = new Random();
            var tmp = new int[data.Length];
            for (var i = 0; i < data.Length; i++)
                tmp[i] = rnd.Next();
            data = tmp;
        }


На самом деле передается не ссылка на массив, а ссылка на ссылку на массив.
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39031987
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВА так?
Это ко мне вопрос? Я как бы в курсе, чем отличается передача ссылки по значению, и ссылке по ссылке. И Рихтера даже читал. И поэтому на вопрос "Чем отличаются структуры от классов?" избегаю популярной формулировки "Структуры передаются по значению, а классы по ссылке".
ЕвгенийВНа самом деле передается не ссылка на массив, а ссылка на ссылку на массив.
В вашем постинге выше именно передается ссылка по значению.
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39032014
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны И Рихтера даже читал. И поэтому на вопрос "Чем отличаются структуры от классов?" избегаю популярной формулировки "Структуры передаются по значению, а классы по ссылке".
А правда чем? Внятного ответа я не слышал ни разу, не от толстеющих бородатых чуваков, работающих архитекторами, не от прыщавых джуниоров.....
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39032031
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Структуры - в стеке, классы - в куче
(поправляет растянутый на коленях свитер, расчесывает бороду)
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39032032
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полный и развернутый ответ потянет по объему как минимум на главу из того же Рихтера. Можно коротко и навскидку перечислить основные отличия: например, для локальных переменные значимого типа память выделяется на стеке, а ссылочного - в куче, а на стеке хранится ссылка в кучу на состояние этой локальной переменной (слово "локальная" относительно значимых типов здесь ключевое). Или что все значимые типы унаследованы от System.ValueType, и что все они неявно изолированные (sealed). Итд итп.
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39032039
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныПолный и развернутый ответ потянет по объему как минимум на главу из того же Рихтера. Можно коротко и навскидку перечислить основные отличия: например, для локальных переменные значимого типа память выделяется на стеке, а ссылочного - в куче, а на стеке хранится ссылка в кучу на состояние этой локальной переменной (слово "локальная" относительно значимых типов здесь ключевое). Или что все значимые типы унаследованы от System.ValueType, и что все они неявно изолированные (sealed). Итд итп.
Это все следствие, но не причина.
Развернутый и полный ответ потянет на 5-7 строчек....
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39032043
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЭто все следствие, но не причина.


Причина почему локальный int не лежит в стеке (кроме боксинга)? Ну так тогда GC зашьется в работе
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39032045
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PallarisЕвгенийВЭто все следствие, но не причина.


Причина почему локальный int не лежит в стеке (кроме боксинга)? Ну так тогда GC зашьется в работе
Он еще может не лежать в стеке, если например является полем класса или в составе массива int[].
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39032047
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВОн еще может не лежать в стеке, если например является полем класса или в составе массива int[].

Ну да, я так и написал - локальный int.

Впрочем, что бы было, если б ничего не хранилось в стеке? Ну, тогда абсолютно все лежало бы в куче:

Код: c#
1.
2.
var a = new Foo();
var b = a;// b - тоже в кучу



Такая полезная фича, как передача по значению (т.е. копирование) и как следствие - неизменность оригинала - тоже потребовала костылей

Код: c#
1.
2.
3.
4.
5.
6.
7.
int a = 5;//в кучу
Method(a);

void Method(int x) //x - ссылка на a? или нужно выделить память
{
    x = 6;// привет a
}



Что еще?
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39032049
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЭто все следствие, но не причина.
Развернутый и полный ответ потянет на 5-7 строчек....
Причина чего? Я как бы выше формулировал вопрос паро отличия, а не про причины/следствия. Ну, и как бы вы действительно считаете, что всё перечисленное - следствия (чего)? И место расположения в методе - тоже следствие?
...
Рейтинг: 0 / 0
Изменить массив по ссылке
    #39033352
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны И место расположения в методе - тоже следствие?
Это про что?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Изменить массив по ссылке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]