powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / вопрос про изменение полей упакованной структуры
17 сообщений из 17, страница 1 из 1
вопрос про изменение полей упакованной структуры
    #38910692
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю Рихтера CLR via C#
В главе про значимые типы
на примере структуры рассматривается пример изменения полей упакованной структуры: создается структура, с n-Количеством полей и методом, изменяющим значения данных полей.
если данная структура не упакована, при вызове метода поля будут изменены,
если упаковать структуру и вызвать метод изменения приведя ссылку на структуру к структуре
то в стеке создастся скрытая копия данной структуры и у этой копии произойдет изменение полей, а на изначальном объекте изменения не произойдет.
для разрешения и данной ситуации предлагается применить интерфейс. Далее реализовав данный интерфейс в структуре, можно у упакованной структуры изменить значения полей.
вот код:
Код: 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.
internal struct Point:ImyChange
    {
        private Int32 m_x;
        public Point(System.Int32 x)
        {
            m_x = x; 
        }
        public void Change(System.Int32 x)
        {
            m_x = x; 
        }
        public override string ToString()
        {
            return String.Format("{0}", m_x);
        }
    }

    public interface ImyChange
        {
     void Change(Int32 x);
        }

    class Program
    {
        static void Main(string[] args)
        {
            Point p = new Point(1);
            Console.WriteLine(p);
            object o = p;
            p.Change(0);
            ((ImyChange) o).Change(4);
            Console.ReadKey();
        }
    }





появление скрытой переменной понятно,
а что происходит при использовании интерфейса, это автором пропущено.
при дизассемблировании появляется виртуальный вызов функции.

В связи с этим вопрос: почему использование интерфейса позволяет изменить упакованную структуру, что происходит за "кулисами".

заранее спасибо.
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910714
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,
Потому что интерфейс это всегда объекты а структуры значения.
Ты замарал эту мышь интерфейсом и можешь запизд..ть этот объект хоть куда. На том конце, в общем то пох..й что послужило прототипом, главное что это чудо реализует скабрезные методэ
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910717
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,
виртуальный вызов функции. - это то тут причем, это из другой оперы, вам ешо рано..
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910752
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Меня интересует именно обратная сторона: что происходит когда через интерфейс вызывается метод упакованной структуры, и как изменяются поля структуры.
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910754
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

инструкция callvirt присутствует в дизасемблированном коде данного примера
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910775
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,
что происходит когда через интерфейс вызывается метод упакованной структуры - если сможете через интерфейс не упакованной.
я сниму шляпу гы
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910803
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Смешно
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910838
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей,
а так попробуйте
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 class Program
    { 
        static readonly Point p = new Point(1);
        static void Main(string[] args)
        {  
            Console.WriteLine(p);
            object o = p;
            p.Change(6);
            ((ImyChange)o).Change(0);
            Console.ReadKey();
        }
    }
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910844
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей...почему использование интерфейса позволяет изменить упакованную структуру...


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  class Program
  {
    static void Main(string[] args)
    {
      Point p = new Point(1);
      Console.WriteLine(p); // 1
      object o = p;
      p.Change(0);
      Console.WriteLine(p); // 0
      Console.WriteLine(o); // 1
      ((ImyChange)o).Change(4);
      Console.WriteLine(p); // 0
      Console.WriteLine(o); // 4
      Console.ReadKey();      
    }
  }



А что изменилось то?
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910923
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,


Я понял, я непонятно задаю вопросы :(

Мне интересно что там за "кулисами" происходит

В примере по значимому типу (в книге имеется ввиду) все расписано отлично. А вот про интерфейс нет
По аналогии с значимым типом (создается экземпляр типа point на стеке, затем метод Change его изменяет, при приведении происходит распаковка и т.д. и т.п.) что происходит когда данная ситуация разрешается при помощи интерфейса, что происходит с полями? их значения копируются в стек или изменения происходят в куче, вот что мне нужно узнать.....
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910929
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey TSV,

Должно измениться значение поля m_x методом change
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910941
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АлексейSergey TSV,

Должно измениться значение поля m_x методом change

А оно изменилось?
По-моему, вы не правильно поняли Рихтера, перечитайте более внимательно.
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910958
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey TSV,

а разве нет? (у вас в комментариях значения проставлены)
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910978
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексейа разве нет? (у вас в комментариях значения проставлены)

Наверное я не так вопрос понял…
Упаковка здесь не производится , поскольку тип o уже упакован. Затем вызывается метод Change, который изменяет поля m_x упакованного типа Point.
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910984
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey TSV,

Совершенно верно
Что происходит дальше? Значения полей меняются непосредственно в куче? Или копии выносятся на стек?
Если на стек, потом происходит обратно упаковка?
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38910989
Sergey TSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей,

Только в куче у объекта о.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  class Program
  {
    static void Main(string[] args)
    {
      Point p = new Point(1);
      Console.WriteLine(p); // 1
      object o = p;
      p.Change(0);
      Console.WriteLine(p); // 0
      Console.WriteLine(o); // 1
      ((ImyChange)o).Change(4);
      Console.WriteLine(p); // 0 <- Не изменилось.
      Console.WriteLine(o); // 4
      Console.ReadKey();      
    }
  }
...
Рейтинг: 0 / 0
вопрос про изменение полей упакованной структуры
    #38911002
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey TSV,

Понял
Этим и объясняется данное поведение....

Спасибо огромное,
Вопросов больше нет. :)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / вопрос про изменение полей упакованной структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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