Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/25: Рейтинг темы: голосов - 25, средняя оценка - 4.92
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373

Разница Struct и Class

08.12.2018, 12:23. Показов 4963. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите почему при вызове метода переменная класса change не изменяет свое изначально заданное значение?
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
/*
Создайте класс MyClass и структуру MyStruct, которые содержат в себе поля public string change. 
В классе Program создайте два метода: 
- static void ClassTaker(MyClass myClass), который присваивает полю change экземпляра myClass значение «изменено». 
- static void StruktTaker(MyStruct myStruct), который присваивает полю change экземпляра myStruct значение «изменено». 
Продемонстрируйте разницу в использовании классов и структур, создав в методе Main() экземпляры структуры и класса. 
Измените, значения полей экземпляров на «не изменено», а затем вызовите методы ClassTaker и StruktTaker. 
Выведите на экран значения полей экземпляров. Проанализируйте полученные результаты. 
*/
using System;
 
namespace _5
{
 
    class MyClass
    {
        public string change;
    }
 
    struct MyStruct
    {
        public string change;
        
    }
 
    class Program
    {
        static void ClassTaker( MyClass myClass)
        {
            myClass.change = "Значение изменилось";
        }
 
        static void StruktTaker(MyStruct myStruct)
        {
            myStruct.change = "Значение изменилось";
        }
 
        static void Main(string[] args)
        {
            MyClass mainClass = new MyClass();
            MyStruct mainStruct = new MyStruct();
 
            mainClass.change = "Не изменено";
            mainStruct.change = "Не изменено";
 
            ClassTaker ( mainClass);
            StruktTaker(mainStruct);
           
 
            Console.WriteLine(mainClass.change);
            Console.WriteLine(mainStruct.change);
        }
    }
}
Миниатюры
Разница Struct и Class  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2018, 12:23
Ответы с готовыми решениями:

Cannot convert null to 'Class.Struct' because it is a value type
есть ли в C# какой-нибудь другой пустой указатель или способ

Чем отличается структура (struct) от класса (class)?
Чем отличается структура(structure) от класса(class) в С# ?

Error: Expected class, delegate, enum, interface, or struct
Создал приложение winforms, добавил класс с реализацией методов, почему то куча ошибок типа "Expected class, delegate, enum,...

8
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
08.12.2018, 13:27
Я так понимаю ,что при создании новой структуры ,она при присваивании имеет свойство копировать сама себя.
Класс создаёт абсолютно новый объект ,с новыми значениями.
https://professorweb.ru/my/csh... l9/9_6.php
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
08.12.2018, 13:34  [ТС]
Я видел этот сайт, но всё равно не понял как проблему решить
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
08.12.2018, 13:43
DragonBorn88, какая проблема? Вам нужно продемонстрировать разницу - она есть и видна. Если хотите изменить значение в передаваемой структуре используйте ref/out.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
08.12.2018, 13:46  [ТС]
Цитата Сообщение от Lexeq Посмотреть сообщение
какая проблема?
Как сделать что бы при вызове " Console.WriteLine(mainClass.change); " было написано "Не изменилось"?
0
 Аватар для Веселый
87 / 88 / 48
Регистрация: 12.10.2013
Сообщений: 1,103
08.12.2018, 13:47
Лучший ответ Сообщение было отмечено DragonBorn88 как решение

Решение

Меняется только при вызове своего собственного метода.

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
namespace STRUCTURA__CLASS
{
    class MyClass
    {
        public string change;
    }
 
    struct MyStruct
    {
        public string change;
        public void StruktTaker()
        {
            change = "Значение изменилось";
        }
 
    }
 
    class Program
    {
        static void ClassTaker(MyClass myClass)
        {
            myClass.change = "Значение изменилось";
        }
 
        static void StruktTaker(MyStruct myStruct)
        {
            myStruct.change = "Значение изменилось";
        }
 
        static void Main(string[] args)
        {
            MyClass mainClass = new MyClass();
            MyStruct mainStruct = new MyStruct();
 
            mainClass.change = "Не изменено";
            mainStruct.change = "Не изменено";
 
            ClassTaker(mainClass);
           // StruktTaker(mainStruct);
            mainStruct.StruktTaker();
 
            Console.WriteLine(mainClass.change);
            Console.WriteLine(mainStruct.change);
            Console.ReadKey();
        }
    }
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
08.12.2018, 13:48
DragonBorn88, не хотите менять - не вызывайте метод который меняет
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,111
Записей в блоге: 2
08.12.2018, 15:19
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Подскажите почему при вызове метода переменная класса change не изменяет свое изначально заданное значение?
Структуры относятся к значимым типам, а значимые типы передаются в параметрах (без модификаторов) по значению, то есть создаётся копия исходной переменной.
0
17 / 15 / 3
Регистрация: 09.06.2016
Сообщений: 75
08.12.2018, 15:31
Структура - значимый тип. Класс - ссылочный тип.
Когда передаем переменную значимого типа, то создается ее копия. В методе работают с копией. Чтобы работать с самой переменной, то надо с помощью ref передать само значение.
Чтобы изменить поле в структуре, то надо обращаться к самому полю(что нарушает одни из правил ООП, инкапсуляция), либо через свойство обращаться к полю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.12.2018, 15:31
Помогаю со студенческими работами здесь

Ошибки в коде - Expected class, delegate, enum, interface, or struct
С с# не знаком, полез на msdn.microsoft.com насчет ошибок, тоже не очень понятно. насчет cs1513 вообще не понятно, вроде есть закрывающая...

Error 1 Invalid token '=' in class, struct, or interface member declaration
{ class Person { public string firstName; public string lastName; public void ShowFullName() ...

Ошибка "Unexpected symbol in class, struct, or interface member declaration"
Unity выдаёт ошибку: Assets/Scripts/Item.cs(11,36): error CS1519: Unexpected symbol `ItemType' in class, struct, or interface member...

Односвязный список: В чём разница между struct и class?
После неудач работы с Vector, а так же отсутствия (Хотя, скорее всего, я просто плохо искал) хорошей русской документации по нему, решил...

Struct VS Class
Здравствуйте. Я прочел интересную статью http://www.rsdn.ru/article/cpp/ObjectsAndPointers.xml#EVPAC по использованию памяти для...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru