Изменение полей упакованной структуры - 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);
}
}