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

Копия структуры меняется при изменении оригинала

18.07.2016, 15:59. Показов 3087. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть структура. Хочу сделать ее резервную копию, создаю структуру такого же типа и присваиваю ей значение первоночальной структуры. Далее провожу действие, которое меняет первоночальную структуру, однако, при проверке, обнаруживается, что "резервная" структура тоже меняется. Структура же не ссылочный тип, почему так происходит?

C#
1
2
3
4
5
6
           Field field = new Field();
           field.Create();
           ..... 
 
            Field field2 = field;
            field.smthfunc(...);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2016, 15:59
Ответы с готовыми решениями:

Если объект копируется по ссылке, то почему копия сохраняется при обнулении оригинала?
Господа, почему срабатывает alert(b.p); ? var a = {}; var b = a; a.p = 1; a = null; alert(a.x); // даёт ошибку ...

Полноценная копия сайта с отвязкой от зависимостей (от оригинала)
Даров, ребят. помогите сделать полную копию сайта www.tt69.ru ... пытался сделать сам, вроде все работало, кроме некоторых .css и скрипта...

При решении блоком Given/Find не меняется результат при изменении приближенных значений
Здравствуйте! При решении задания по ТОЭ возникла необходимость использования блока Given/Find, но при решении выяснилось, что при...

23
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
18.07.2016, 15:59
Цитата Сообщение от NikitaLitvinkov Посмотреть сообщение
провожу действие, которое меняет первоночальную структуру
Меняет как?
Если у вас в первоначальной структуре есть поле ссылочного типа и вы изменяете свойство этого объекта, то изменения будут видны везде.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
18.07.2016, 16:14
NikitaLitvinkov, покажи весь код, начина я объявления структуры
0
77 / 77 / 42
Регистрация: 30.09.2014
Сообщений: 342
18.07.2016, 16:15
field это ваша структура?? на класс похоже больше...
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
19.07.2016, 00:00
C#
1
2
3
4
5
6
7
ICloneable
 
 
public object Clone()
        {
            return MemberwiseClone();
        }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.07.2016, 02:06
DataPlanner, если верить автору, то у него структура, так что Clone с такой реализацией — это равносильно обычному присваиванию.
С той разницей, что при обычном присваивании нет упаковки.
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
19.07.2016, 03:02
Цитата Сообщение от kolorotur Посмотреть сообщение
структура,
Верно, тогда только так:
C#
1
2
3
4
5
6
7
8
9
10
11
public static T DeepCopy<T>(this T obj)
        {
            BinaryFormatter bf = new BinaryFormatter();
            using (MemoryStream ms = new MemoryStream())
            {
                bf.Serialize(ms, obj);
                ms.Position = 0;
                T t = (T)bf.Deserialize(ms);
                return t;
            }
        }
0
Эксперт .NET
 Аватар для Usaga
14138 / 9362 / 1350
Регистрация: 21.01.2016
Сообщений: 35,196
19.07.2016, 04:48
DataPlanner, структура полностью копируется при простом присваивании (a = b), для этого подобных телодвижений (страшных) сотворять не нужно.

Ждём ответа ТС о содержимом структуры. Очень вероятно, что у него есть поле ссылочного типа.

Добавлено через 2 минуты
Либо вообще не структура используется
0
77 / 77 / 42
Регистрация: 30.09.2014
Сообщений: 342
19.07.2016, 08:56
шел второй день ожидания кода структуры
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.07.2016, 10:06
Цитата Сообщение от Usaga Посмотреть сообщение
структура полностью копируется при простом присваивании (a = b)
Копируются все поля. Если какие-то из полей являются переменными ссылочного типа, то копируются только ссылки, а не объекты, на которые они ссылаются.
Представленный товарищем DataPlanner код сериализации клонирует (почти) весь граф объектов.
0
Эксперт .NET
 Аватар для Usaga
14138 / 9362 / 1350
Регистрация: 21.01.2016
Сообщений: 35,196
19.07.2016, 10:26
kolorotur, я это понимаю. Но это решение всё равно не очень элегантно
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.07.2016, 10:29
Цитата Сообщение от Usaga Посмотреть сообщение
это решение всё равно не очень элегантно
Согласен.
К сожалению, в дотнете отсутствуют готовые средства для элегантного глубокого клонирования
0
77 / 77 / 42
Регистрация: 30.09.2014
Сообщений: 342
19.07.2016, 16:29
Ребят можете объяснить о чем вы гутарите, что-то я не уловил )

написал структуру

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 struct myStruct
        {
            public string myString;
            public int[] myArray;
 
 
           рublic void Start()
            {
 
                myArray = new int[] { 1, 2, 3, 4, 5 };
                myString = "5465";
 
            }
 
 
            public void str()
            {
 
                myString = "----";
                myArray = new int[] { 0, 0, 0, 0, 0 };
 
            }
        }

Две переменные ссылочного типа , и функцию на изменения их .


в самой программе :


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  string res = "";
 
 
            myStruct st = new myStruct();
            st.Start();
            res ="Структура st :" + st.myString + "\t" + string.Join("", st.myArray);
 
 
            myStruct st2 = st;
 
            res +="\nСтруктура st2 :" +st2.myString + "\t" + string.Join("", st2.myArray);
 
 
 
            st2.str();
 
 
            res += "\nСтруктура st :" + st.myString + "\t" + string.Join("", st.myArray);
            res += "\nСтруктура st2 :" + st2.myString + "\t" + string.Join("", st2.myArray);
 
 
         MessageBox.Show(res);

Собственно создал , сделал копию, поменял копию , вывел , получил =>


Структура st :5465 12345
Структура st2 :5465 12345
Структура st :5465 12345
Структура st2 :---- 00000
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.07.2016, 16:59
Цитата Сообщение от OTT Посмотреть сообщение
Собственно создал , сделал копию, поменял копию , вывел , получил
Собственно int - это значимый тип, string - ссылочный, но с прибабахами. Любое изменение переменной этого типа приводит к созданию нового экземпляра этого типа. Код:
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
    public class Foo
    {
        public int Num { get; set; }
    }
 
    struct MyStruct
        {
            public void Init()
            {
                bar = new Foo();
            }
 
            public Foo bar;
        }
 
        static void Main(string[] args)
        {
            MyStruct a, b;
            a = new MyStruct();
            a.Init();
            a.bar.Num = 0;
            b = a;
            a.bar.Num = 2;
            Console.WriteLine("{0} - {1}", a.bar.Num, b.bar.Num);
            Console.ReadKey();
        }
Выведет "2 - 2", а не "2 - 0"

Добавлено через 3 минуты
А вот если мы заменим в структуре объект класса Foo на переменную int:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        struct MyStruct
        {
            public void Init()
            {
                bar = 0;
            }
 
            public int bar;
        }
 
        static void Main(string[] args)
        {
            MyStruct a, b;
            a = new MyStruct();
            a.Init();
            a.bar = 0;
            b = a;
            a.bar = 2;
            Console.WriteLine("{0} \t{1}", a.bar, b.bar);
            Console.ReadKey();
        }
получим вожделенное "2 - 0"
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
19.07.2016, 17:07
Цитата Сообщение от aquaMakc Посмотреть сообщение
int - это значимый тип
aquaMakc, у ТС не int, а int[] - а это уже массив, ссылочный тип, вне зависимости от типа элементов.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.07.2016, 17:18
Цитата Сообщение от insite2012 Посмотреть сообщение
у ТС не int, а int[] - а это уже массив, ссылочный тип, вне зависимости от типа элементов.
что у ТСа мы до сих пор не знаем ). А вот OTT таки продемонстрировал, что если ссылочный Array лежит в структуре, то другая структура принимает его по значению.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.07.2016, 18:01
Цитата Сообщение от OTT Посмотреть сообщение
можете объяснить о чем вы гутарите, что-то я не уловил )
Вот об этом, на вашем же примере:
C#
1
2
st.myArray[0] = 123;
MessageBox.Show(st2.myArray[0].ToString());
Цитата Сообщение от aquaMakc Посмотреть сообщение
если ссылочный Array лежит в структуре, то другая структура принимает его по значению.
Другая структура принимает ссылку на массив по значению.
Ссылку, не сам массив.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
19.07.2016, 18:06
Цитата Сообщение от kolorotur Посмотреть сообщение
Другая структура принимает ссылку на массив по значению.
Ссылку, не сам массив.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        struct MyStruct
        {
            public void Init()
            {
                bar = new int[] { 0, 1, 2 };
            }
 
            public int[] bar;
        }
 
        static void Main(string[] args)
        {
            MyStruct a, b;
            a = new MyStruct();
            a.Init();
            b = a;
            a.bar = new int[] { 3, 4, 5 };
            Console.WriteLine("{0} - {1}", String.Join("", a.bar), String.Join("", b.bar));
            Console.ReadKey();
        }
получаем на выходе "345 - 012", еслиб была передача по ссылке было бы "345 - 345", или я что-то упускаю из вида?

Добавлено через 1 минуту
а, всё, дошло. Таки да, ссылку.

Добавлено через 45 секунд
я оператором new просто создавал новый массив. Туплю, пора домой.
0
77 / 77 / 42
Регистрация: 30.09.2014
Сообщений: 342
20.07.2016, 09:07
А понял... в моем примере все норм было потому что я массив новый делал....
C#
1
2
3
4
5
6
7
 public void str()
            {
 
                myString = "----";
                myArray = new int[] { 0, 0, 0, 0, 0 };
 
            }
если поменять например на

C#
1
2
3
4
5
6
7
            public void str()
            {
 
                myString = "----";
                Array.Reverse(myArray);
 
            }
то все происходит как вы говорите...

А что за "прибабах" у стринга такой ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
20.07.2016, 09:44
Цитата Сообщение от OTT Посмотреть сообщение
А что за "прибабах" у стринга такой ?
Вы о чем?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.07.2016, 09:44
Помогаю со студенческими работами здесь

DataViewRowState не меняется при изменении в DataGrid
Есть DataGrid соединенный с DataSet, при изменении значения в ячейке запускается цикл, который по DataViewRowState ищет...

При изменении DataTable не меняется RowState
Здравствуйте, уважаемые! Столкнулась с такой странностью... Через Binding привязываю данные из DataTable к TextBox, данные в TextBox,...

Меняется стиль при изменении класса
Как же весело находить различные баги в своем коде... У нас есть HTML footer`а вместе с bootstrap сеткой: &lt;footer&gt; &lt;div...

Не меняется дата при изменении времени
tz_database tzDB; tzDB.load_from_file(&quot;C:/date_time_zonespec.csv&quot;); std::string ms = msg.substr(0, msg.length()-2); ptime...

При изменении одного ресурса, меняется второй.
У меня вопрос: почему при изменении 'brush' меняются стили двух кнопок? Я же меняю не сам ресурс &quot;myBrush&quot;, а новый объект...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru