Изменение полей упакованной структуры - C#
Формулировка задачи:
Читаю Рихтера CLR via C#
В главе про значимые типы
на примере структуры рассматривается пример изменения полей упакованной структуры: создается структура, с n-Количеством полей и методом, изменяющим значения данных полей.
если данная структура не упакована, при вызове метода поля будут изменены,
если упаковать структуру и вызвать метод изменения приведя ссылку на структуру к структуре
то в стеке создастся скрытая копия данной структуры и у этой копии произойдет изменение полей, а на изначальном объекте изменения не произойдет.
для разрешения и данной ситуации предлагается применить интерфейс. Далее реализовав данный интерфейс в структуре, можно у упакованной структуры изменить значения полей.
вот код:
появление скрытой переменной понятно,
а что происходит при использовании интерфейса, это автором пропущено.
при дизассемблировании появляется виртуальный вызов функции.
В связи с этим вопрос: почему использование интерфейса позволяет изменить упакованную структуру, что происходит за "кулисами".
заранее спасибо.
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(); } }
Решение задачи: «Изменение полей упакованной структуры»
textual
Листинг программы
using System; struct Struct { public int X { get; set; } } class Class { public Struct Struct { get; set; } } class Program { static void Main(string[] args) { var str = new Class() {Struct = new Struct() {X = 10}}; Console.WriteLine(str.Struct.X); str.Struct.X++; Console.WriteLine(str.Struct.X); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д