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

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

20.03.2015, 11:03. Показов 4324. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.03.2015, 11:03
Ответы с готовыми решениями:

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

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

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

3
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.03.2015, 13:27
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
Так а почему?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.04.2016, 09:55
Цитата Сообщение от sapr5_5 Посмотреть сообщение
почему использование интерфейса позволяет изменить упакованную структуру, что происходит за "кулисами".
Подразумевается, вероятно, что у переменной "р" тип должен быть не Point, a сразу IMyChange.
Тогда у вас структура будет изначально запакована и отпадут описанные проблемы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2016, 09:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru