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

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

09.03.2018, 18:53. Просмотров 1986. Ответов 5
Метки нет (Все метки)

Всем, привет. Такой вопрос, при написании вот такого кода в c#
C#
1
2
3
4
5
6
7
8
struct a
{
}
 
int main()
{
  a first;
}
first- это статическая переменная? Я знаю, что для того, чтобы обращаться к переменным этого объекта для начала их нужно инициализировать. Однако я не понимаю, что такое тогда объект first? Выделено ли при создании этого объекта уже память для ее внутренних переменных или нет? Или это просто скажем так указатель?
У меня есть догадка, что при создании вот такого объекта создаются просто скажем так "указатели". Скажем так при создании вот такой переменной память под нее не выделяется. Создаются только адреса для нее и для внутренних ее объектов, поэтому и необходимо их инициализировать. Однако если написать вот так:
a first= new a();
То тогда создадутся уже объекты и проинициализируются базовыми значениями. Правильно думаю?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2018, 18:53
Ответы с готовыми решениями:

Инициализация полей классов
Сколько раз здесь будет инициализирован x? class InitialierTestClass { public...

Инициализация полей структур
Насколько знаю, у экземпляров классов поля всегда инициализируются значениями по умолчанию перед...

Не происходит инициализация полей
есть класс public class DinnerParty { private const int costOfFoodPerPerson = 30; ...

Инициализация в классе полей типа Enum
Добрый день! Есть класс, в нем есть поле перечисления. class Worker { private string...

5
1740 / 1333 / 1407
Регистрация: 28.10.2016
Сообщений: 4,267
09.03.2018, 19:01 2
Лучший ответ Сообщение было отмечено Hitoku как решение

Решение

При использовании new по дефолту выставляется 0 и в принципе к элементу структуры мы сможем обратиться, чего нельзя сказать о первом варианте, так что считаю да, Вы думаете правильно
C#
1
2
3
4
5
6
7
8
9
10
11
12
    class Program
    {
        struct a { public int n; }
 
        static void Main()
        {
            a first, second = new a(); ;
            first.n = 10;
            Console.WriteLine(first.n + " " + second.n);
            Console.ReadKey();
        }
    }
1
Администратор
Эксперт .NET
12919 / 10534 / 4361
Регистрация: 17.03.2014
Сообщений: 21,236
Записей в блоге: 1
09.03.2018, 20:05 3
Лучший ответ Сообщение было отмечено Hitoku как решение

Решение

Цитата Сообщение от Ermitash Посмотреть сообщение
first- это статическая переменная?
Нет. Это локальная переменная.

Цитата Сообщение от Ermitash Посмотреть сообщение
Однако я не понимаю, что такое тогда объект first?
Именнованная область памяти с размером достаточным для хранения значения данного типа. Сообственно как и любая другая локальная переменная.

Цитата Сообщение от Ermitash Посмотреть сообщение
Выделено ли при создании этого объекта уже память для ее внутренних переменных или нет?
Да.

Цитата Сообщение от Ermitash Посмотреть сообщение
Или это просто скажем так указатель?
Нет т.к. struct это значимый тип (value type).

Цитата Сообщение от Ermitash Посмотреть сообщение
У меня есть догадка, что при создании вот такого объекта создаются просто скажем так "указатели". Скажем так при создании вот такой переменной память под нее не выделяется. Создаются только адреса для нее и для внутренних ее объектов, поэтому и необходимо их инициализировать. Однако если написать вот так:
a first= new a();
То тогда создадутся уже объекты и проинициализируются базовыми значениями. Правильно думаю?
Догадка ошибочная. Поля необходимо инициализировать т.к. речь идет о локальной переменной на которые распространяется правило обязательной инициализации.
0
1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 94
10.03.2018, 13:07  [ТС] 4
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Выделено ли при создании этого объекта уже память для ее внутренних переменных или нет?
Да.
Тогда не понимаю, почему при написании вот такого кода компилятор выдаст ошибку?
C#
1
2
3
4
5
6
7
8
9
10
struct a
{
  public int b;
}
 
int main()
{
  a first;
  Console.WriteLine(first.b);
}
По вашим словам, если выделяется память, то переменной должно быть присвоено рандомное значение, то есть мусор. И при выводе инфы там должно быть просто рандомное значение, но никак не ошибка компиляции.
0
Администратор
Эксперт .NET
12919 / 10534 / 4361
Регистрация: 17.03.2014
Сообщений: 21,236
Записей в блоге: 1
10.03.2018, 13:18 5
Цитата Сообщение от Ermitash Посмотреть сообщение
Тогда не понимаю, почему при написании вот такого кода компилятор выдаст ошибку?
Потому что по правилам языка все локальные переменные должно явно инициализироваться.

Цитата Сообщение от Ermitash Посмотреть сообщение
По вашим словам, если выделяется память, то переменной должно быть присвоено рандомное значение, то есть мусор. И при выводе инфы там должно быть просто рандомное значение, но никак не ошибка компиляции.
Что должно происходить в таком случае решают авторы языка/платформы. Разработчики C# решили что никакого мусора после выделения быть не должно. Именно поэтому локальные переменные нужно явно инициализировать и именно поэтому мы получаем ошибку компиляции.
0
1 / 1 / 1
Регистрация: 14.10.2015
Сообщений: 94
10.03.2018, 13:22  [ТС] 6
Хорошо, я понял, спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2018, 13:22

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

Инициализация структуры как поля класса
Дайте пожалуйста объяснение, как инициализируеся структура которая является полем класса: Есть...

Изменение полей упакованной структуры
Читаю Рихтера CLR via C# В главе про значимые типы на примере структуры рассматривается пример...

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

Инициализация полей - в чем разница двух приведенных реализаций
class first { public first() { a=5; b="строка"; } int a;...


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

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

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