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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы