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

Изменить значения в структуре

15.02.2013, 17:02. Показов 11924. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как изменять значения в структуре?
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
namespace struct_edit_value
{
    //
    //
    class MyClass
    {
        struct People
        {
            string sName;
            int iAge;
            public bool bShow;
 
            public People(string s, int i)
            {
                sName = s;
                iAge = i;
                bShow = true;
            }
            public string GetName()
            {
                return sName;
            }
            public void SetName(string s)
            {
                sName = s;
            }
        }
 
        static List<People> peopleInfo;
 
        public static int ShowInfo(string s)
        {
            peopleInfo = new List<People>();
            peopleInfo.Add(new People("Abcd", 10));
            peopleInfo.Add(new People("Efgh", 20));
 
            foreach (People p in peopleInfo)
            {
                Console.WriteLine(p.GetName());
                // значение не меняется
                p.SetName("AAA");
            }
            for (int i = 0; i < peopleInfo.Count; i++)
            {
                // ошибка
                peopleInfo[i].bShow = false;
            }
 
            foreach (People p in peopleInfo)
            {
                Console.WriteLine(p.GetName());                
            }
 
            return 0;
        }
    }
 
    //
    //
    class Program
    {        
        static void Main(string[] args)
        {
            Console.WriteLine(MyClass.ShowInfo("Hello"));
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2013, 17:02
Ответы с готовыми решениями:

Как изменить все элементы в структуре одним действием
Есть к примеру такая структура: Structure IntData Public ID1 As Integer Public ID2 As Integer Public...

Изменение значения в структуре
Имеется двусвязный список со следующими параметрами: struct eachNodeNetwork { int i, j; int weightNode; int...

Изменить программу так, чтобы вторая строка в динамической структуре затиралась
#define _CRT_SECURE_NO_WARNINGS #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include...

35
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 17:04
Можно сначала вопрос?
Зачем вы засунули структуру в класс?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 17:08
Цитата Сообщение от Qwe1 Посмотреть сообщение
Как изменять значения в структуре?
Вот так:
C#
1
2
3
4
5
6
7
8
            for (int i = 0; i < peopleInfo.Count; i++) (People p in peopleInfo)
            {
                People p = peopleInfo[i];
                Console.WriteLine(p.GetName());
                // значение не меняется
                p.SetName("AAA");
                peopleInfo[i] = p;
            }
Структура - значимый тип, поэтому при ее извлечении из списка извлекается копия, а не оригинал.

Цитата Сообщение от n1l Посмотреть сообщение
Зачем вы засунули структуру в класс?
А с этим-то что не так?
0
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 17:15
Эта структура описана в классе, т.е. тут она должна будет находиться уже не в стеке а в куче.
Т.е. будет ссылочной, а не вещественной.
Я не понимаю зачем.

Добавлено через 3 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Структура - значимый тип, поэтому при ее извлечении из списка извлекается копия, а не оригинал.
Да и тут вы ошибаетесь, структура будет находится в куче, если она определена в списке.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 17:16
Цитата Сообщение от n1l Посмотреть сообщение
Эта структура описана в классе, т.е. тут она должна будет находиться уже не в стеке а в куче.
С чего бы это?
Она же описана в классе, а не создана.
1
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 17:18
Цитата Сообщение от kolorotur Посмотреть сообщение
С чего бы это?
Она же описана в классе, а не создана.
Ну так для нее создаться объект тип, сразу.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 17:38
Цитата Сообщение от n1l Посмотреть сообщение
Да и тут вы ошибаетесь, структура будет находится в куче, если она определена в списке.
Цитата Сообщение от n1l Посмотреть сообщение
Ну так для нее создаться объект тип, сразу.
Смешались кони, люди...

1. Факт нахождения структуры в куче не отменяет того, что это значимый тип, копирующийся при извлечении из списка.
2. При описании любого типа никакой объект не создается, не важно - структура это или класс.
1
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 17:59
Абсолютно не верные утверждения. Посмотрите пожалуйста описание упаковки и распаковки.

Структура в коде ниже только создается в стеке, после она упаковывается и ссылка на нее помещается в список.
C#
1
peopleInfo.Add(new People("Abcd", 10));
Структура не будет копироваться, будет копироваться ссылка на нее.

вложенные типы

При создании объекта-типа(не объекта) MyClass с описанием статических методов сразу же создастся объект-тип структуры. Это не плохо, я просто не понимаю зачем?

Добавлено через 4 минуты
Точнее это не плохо вообще, но тут это плохо.
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
15.02.2013, 18:22
n1l, Скомпилируйте код выше и покажите упаковку\распаковку,я лично в ILе ее не нашел.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 18:25
Цитата Сообщение от n1l Посмотреть сообщение
Абсолютно не верные утверждения.
Это очень смелое заявление.

Цитата Сообщение от n1l Посмотреть сообщение
Структура в коде ниже только создается в стеке, после она упаковывается и ссылка на нее помещается в список.
Какое отношение это имеет к тому, где сама структура объявлена? Вы понимаете разницу между объявлением и созданием?
Я, на всякий случай, говорю про объявление: не важно, где объявлен тип, внутри класса или сразу в неймспейсе - это никак не влияет на то, где будет выделяться под него память.
Ну и упаковки никакой, конечно же, не будет, ибо это обощенный тип.
Если бы был ArrayList или List<object>, то да, имела бы место упаковка.

Цитата Сообщение от n1l Посмотреть сообщение
Структура не будет копироваться, будет копироваться ссылка на нее.
Учим матчасть.
Структура - не ссылочный тип, в данном случае хранится не в упакованном виде, а значит ссылки на нее не может быть в принципе.
Следовательно, при любой попытке извлечь этот экземпляр из списка, вы будете извлекать всю копию структуры.
C#
1
2
3
4
5
peopleInfo.Add(new People("Abcd", 10));
var p = peopleInfo[0];
p.SetName("Blabla");
 
Console.WriteLine(peopleInfo[0].GetName()); // "Abcd", потому что в p - копия структуры.
Я даже скажу страшное: при распаковке все равно будет возвращаться копия.

Цитата Сообщение от n1l Посмотреть сообщение
вложенные типы
Это-то здесь зачем?
Я прекрасно знаком с вложенными типами.

Цитата Сообщение от n1l Посмотреть сообщение
При создании объекта-типа(не объекта) MyClass с описанием статических методов сразу же создастся объект-тип структуры.
Так мы говорим об объектах или о типах?
Тип - да, будет создан, со всеми его статическими полями и с запуском статического конструктора, с этим никто и не спорил. Но какое отношение местоположение типа имеет к тому, где будет создан экземпляр этого типа? Или я что-то не так понял?

Цитата Сообщение от n1l Посмотреть сообщение
я просто не понимаю зачем?
Один класс чисто семантически может являться вложенным. То есть не имеющим смысла без своего родителя.

Цитата Сообщение от n1l Посмотреть сообщение
Точнее это не плохо вообще, но тут это плохо.
Оправдано, если People используется только в контексте использования MyClass.
Из приведенного куска кода это, конечно же, не видно.

Добавлено через 19 секунд
Цитата Сообщение от Noob.net Посмотреть сообщение
я лично в ILе ее не нашел.
Потому что ее там нет.
1
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 18:57
Ах, ну да. Это же generik от структуры, он оптимизирован и потому вызывать упаковку не будет.
Но данные будут храниться в куче, это точно.
А раз так, тогда структура тут не нужна, тем более вложенная в класс.

Добавлено через 9 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Какое отношение это имеет к тому, где сама структура объявлена?
А я и говорил об объекте типе.

Цитата Сообщение от kolorotur Посмотреть сообщение
Структура - не ссылочный тип, в данном случае хранится не в упакованном виде, а значит ссылки на нее не может быть в принципе.
Следовательно, при любой попытке извлечь этот экземпляр из списка, вы будете извлекать всю копию структуры.
Она не может хранится в стеке если она объявлена как часть списка.
Список - ссылочный тип, и все его элементы тоже ссылочные типы.

Это все равно что объявить класс так:

C#
1
2
3
4
class SomeClass
{
  int i = 0;
}
И сказать, что при вызове этого поля мы будем работать с его копией.


Цитата Сообщение от kolorotur Посмотреть сообщение
Я даже скажу страшное: при распаковке все равно будет возвращаться копия.
При упаковке и распаковке конечно мы будем использовать копию.

Добавлено через 3 минуты
Ну конечно же, вы же сначала копируете значение переменной, в структуру в стеке.
C#
1
2
var p = peopleInfo[0];
p.SetName("Blabla");
А вот если сделать вот так, сразу станет понятно почему вы ошибаетесь.
C#
1
peopleInfo[0].SetName("Blabla");
Добавлено через 16 минут
Ээээ, упс.

0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 19:11
Цитата Сообщение от n1l Посмотреть сообщение
А раз так, тогда структура тут не нужна, тем более вложенная в класс.
Простите, но я запутался: мы говорим о необходимости структуры для решения конкретной задачи или о том, где выделяется память под структуру в зависимости от того, где объявлена эта структура?
Я - про второй вариант.

Цитата Сообщение от n1l Посмотреть сообщение
А я и говорил об объекте типе.
Еще раз простите, но мой изначальный комментарий был адресован вот этой фразе:
Цитата Сообщение от n1l Посмотреть сообщение
Эта структура описана в классе, т.е. тут она должна будет находиться уже не в стеке а в куче.
Т.е. будет ссылочной, а не вещественной.
Цитата Сообщение от n1l Посмотреть сообщение
Она не может хранится в стеке если она объявлена как часть списка.
Список - ссылочный тип, и все его элементы тоже ссылочные типы.
Простите, щито?
C#
1
int[] array = new int[20];
Согласно сказанному вами, все элементы этого массива - ссылочные типы, хранящиеся в упакованном виде?
Внесу ясность: массив - ссылочный тип, память под него выделяется в куче.
Но вот если элементы массива - структуры, то в памяти они все равно хранятся как структуры, хоть и в куче.
То есть никакой упаковки/распаковки.

Цитата Сообщение от n1l Посмотреть сообщение
И сказать, что при вызове этого поля мы будем работать с его копией.
Конечно, а вы как думали?

Цитата Сообщение от n1l Посмотреть сообщение
При упаковке и распаковке конечно мы будем использовать копию.
И без упаковки и распаковки - все равно будет создаваться копия при извлечении из списка или присваивании переменной.

Цитата Сообщение от n1l Посмотреть сообщение
А вот если сделать вот так, сразу станет понятно почему вы ошибаетесь.
Цитата Сообщение от n1l Посмотреть сообщение
Ээээ, упс.
Вот и я о том же.
1
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 19:28
Вот что меня запутало.

C#
1
2
List<int> lst = new List<int> { 1, 2, 3 };
            lst[0] = 3;
Добавлено через 6 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Еще раз простите, но мой изначальный комментарий был адресован вот этой фразе:
Я хотел поправится, но не успел. В общем я говорил о надобности структуры и тем более вложенной.

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Конечно, а вы как думали?
Как так?

C#
1
2
3
4
5
6
7
8
9
class SomeClass
{
  int i = 0;
}
 
 
var sc = new SomeClass{i=5};
 
sc.i = 10;   //Я уверен, что тут мы будем работать с оригиналом
Добавлено через 47 секунд
Цитата Сообщение от kolorotur Посмотреть сообщение
И без упаковки и распаковки - все равно будет создаваться копия при извлечении из списка или присваивании переменной.
Что вы скажете о примере выше?

Добавлено через 5 минут
Я теряюсь в догадках, но никак не могу понять, почему если определить список List<int> lst = new List<int>{1,2,3}
То при вызове
List[0] мы можем работать с оригиналом,
а в структуре написанной выше нет.
Вроде бы практически одинаковый generik.
Хотя может бытьв list<int> используется ref.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 19:30
Цитата Сообщение от n1l Посмотреть сообщение
Я хотел поправится, но не успел. В общем я говорил о надобности структуры и тем более вложенной.
Вас понял.
Главное, что прояснили этот момент

Цитата Сообщение от n1l Посмотреть сообщение
Как так? Я уверен, что тут мы будем работать с оригиналом
Конечно же здесь вы правы - обращение к структуре-полю напрямую не приведет к копированию.
Когда писал ответ, в голове у меня крутилось слово "свойство".

Добавлено через 1 минуту
Цитата Сообщение от n1l Посмотреть сообщение
Я теряюсь в догадках, но никак не могу понять, почему если определить список List<int> lst = new List<int>{1,2,3}
То при вызове
List[0] мы можем работать с оригиналом,
а в структуре написанной выше нет.
Здесь вопрос в другом: а с чего вы решили, что вы можете работать с оригиналом?
У инта нет каких-то свойств, чтобы явно определить - копия это или не копия.

Но могу вас заверить: при работе с классом List, хранящим структуры, обращение по индексу всегда возвращает копию, пусть это будет пользовательский тип или тот же инт.
1
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 19:30
Спасибо, что прояснили для меня некоторые моменты.
Все таки хотелось бы разобраться полностью с этим.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 19:31
Цитата Сообщение от n1l Посмотреть сообщение
Все таки хотелось бы разобраться полностью с этим.
Что именно вызывает сомнения?
Постараюсь объяснить.
0
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 19:33
Цитата Сообщение от kolorotur Посмотреть сообщение
У инта нет каких-то свойств, чтобы явно определить - копия это или не копия.
Я в Visual Studio просматриваю call stack при работе с переменными вещественного типа.
Ну конечно не всегда удается просмотреть, потому иногда доверяюсь опыту полученному ранее.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 19:34
Цитата Сообщение от n1l Посмотреть сообщение
Я в Visual Studio просматриваю call stack при работе с переменными вещественного типа.
Call Stack - это же более чем череда вызовов методов, нет?
Он же вроде как не отображает факт копирования/упаковки/распаковки.
0
 Аватар для n1l
136 / 138 / 18
Регистрация: 26.07.2010
Сообщений: 911
15.02.2013, 19:42
Цитата Сообщение от kolorotur Посмотреть сообщение
Что именно вызывает сомнения?
Постараюсь объяснить.
Для меня это просто было очень большой неожиданностью. А так же это значит, что если я создаю свою структуру, то скорее всего для нее мне нужно будет описывать свои обобщения, что бы работать с оригиналами переменных тогда, когда это нужно.

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Call Stack - это же более чем череда вызовов методов, нет?
Он же вроде как не отображает факт копирования/упаковки/распаковки.
Там просто появляются еще watch и locals и можно просмотреть какие переменные когда создаются и сколько.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 19:44
Цитата Сообщение от n1l Посмотреть сообщение
А так же это значит, что если я создаю свою структуру, то скорее всего для нее мне нужно будет описывать свои обобщения, что бы работать с оригиналами переменных тогда, когда это нужно.
Ну структуры - они такие, да.
Поэтому их не рекомендуется использовать, если планируется, что экземпляры будут часто копироваться или передаваться из метода в метод - слишком много оверхеда на копирование будет приходиться.

Что касается обобщений, то это применительно только к расположению структур в памяти, а от копирования при передачи в метод или возвращения из метода, к сожалению, не отделаться. Ну, если только использовать ref/out.

Добавлено через 47 секунд
Цитата Сообщение от n1l Посмотреть сообщение
Там просто появляются еще watch и locals и можно просмотреть какие переменные когда создаются и сколько.
Дык это отдельные окошки
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.02.2013, 19:44
Помогаю со студенческими работами здесь

Сбрасываются значения переменных в структуре
Доброго времени суток. Есть одна структура. struct { bool AllowInFile; bool AllowInCLI; char * FileName; }...

Как присвоить значения структуре?
У меня есть структура с картами (масть и достоинство карты): struct Card { char mast; char dostoinstvo; } Таких карт...

Присвоение значения данным в структуре
Здравствуйте! Подскажите, пожалуйста, как присвоить значение переменной структуры. Например: ds.name = name_; Заранее благодарен!

Функция, которая возвращает 2 значения в структуре
В функции searchMax должны возвращаться координаты, как это сделать? #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include...

Не могу присовить структуре значения и записать в файл
struct data { int id; char name; char grupp; } data1; int _tmain(int argc, _TCHAR* argv) { char x = &quot;sss&quot;;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
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. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru