Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 20.03.2015
Сообщений: 1
1

Изменение полей упакованной структуры

20.03.2015, 11:03. Просмотров 2550. Ответов 3
Метки нет (Все метки)


Читаю Рихтера 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.03.2015, 11:03
Ответы с готовыми решениями:

Инициализация полей структуры
Всем, привет. Такой вопрос, при написании вот такого кода в c# struct a { } int main() { ...

Структура и список полей структуры
Здравствуйте, помогите с задачей: Есть структура: struct MyStruct { int ID; ...

Совместите объявление и инициализацию структуры. После инициализации структуры выполните изменение ее полей с последующи
Написать программу структурного описания каталога одной книги. ...

Данные упакованной структуры вывести на экран
По введенному числу (в двоичной системе счисления) представляющего собой упакованную заданную...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
3
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.03.2015, 13:27 2
C#
1
2
3
4
5
6
7
8
        Point p = new Point(1);
        Console.WriteLine(p);
        object o = p;
        p.Change(0);
        Console.WriteLine(p);
        ((ImyChange)o).Change(4);
        Console.WriteLine(p);
        Console.ReadKey();
всё наоборот - при вызове через интерфейс ничего работь не будет В смысле будет меняться o, а вот p останется таким, каким было.

И да, не называйте объекты o, слишком на ноль похоже и в тексте легко запутаться.

Добавлено через 38 минут
Но вообще изменяемые структуры это зло Например долго нужно думать, почему этот код даже не компилируется:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
    }
}
1
0 / 0 / 0
Регистрация: 06.04.2016
Сообщений: 1
06.04.2016, 08:59 3
Так а почему?
0
Эксперт .NET
14848 / 11236 / 2948
Регистрация: 17.09.2011
Сообщений: 18,818
06.04.2016, 09:55 4
Цитата Сообщение от sapr5_5 Посмотреть сообщение
почему использование интерфейса позволяет изменить упакованную структуру, что происходит за "кулисами".
Подразумевается, вероятно, что у переменной "р" тип должен быть не Point, a сразу IMyChange.
Тогда у вас структура будет изначально запакована и отпадут описанные проблемы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2016, 09:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Извлечь данные из упакованной двоичной структуры
Поле управления диспетчером кадра в протоколе управления логическим каналом имеет формат: №...

Формирование и вывод на печать упакованной структуры из составляющих
Господа, проблема в том, что не совсем понимаю задание. Объясните что от меня требуется! Задание:...

Помещение структуры в вектор, удаление структуры, изменение элементов структуры
Здравствуйте. Помогите разобраться с тем, как: 1 - находить элементы в векторе зная уникальный...

Динамическое изменение структуры таблицы для организации древовиднойой структуры
Доброго времени суток. У меня такой вот вопрос: Необходимо сделать возможность добавления записей в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.