Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
1

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

11.10.2018, 16:00. Просмотров 2391. Ответов 45
Метки нет (Все метки)

Насколько знаю, у экземпляров классов поля всегда инициализируются значениями по умолчанию перед тем как в дело вступает конструктор. Почему у структур для инициализации полей используется конструктор по умолчанию для этих целей?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2018, 16:00
Ответы с готовыми решениями:

Инициализация массива структур
суть в чем. есть структура SS полем которой является матрица S. есть массив x - содержащий 8...

Инициализация структуры содержащей массив структур
Всем привет. на с# только начал писать, и нужно перенести сишный код в котором было несколько...

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

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

45
Модератор
7992 / 5591 / 1622
Регистрация: 21.04.2018
Сообщений: 16,728
Записей в блоге: 2
11.10.2018, 16:33 2
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
у экземпляров классов поля всегда инициализируются значениями по умолчанию перед тем как в дело вступает конструктор. Почему у структур для инициализации полей используется конструктор по умолчанию для этих целей?
А как Вы проверили это утверждение? Вы же не можете для структуры создать свой конструктор по умолчанию. И проверить до него происходит инициализация или он сам инициализирует.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
11.10.2018, 16:35  [ТС] 3
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы же не можете для структуры создать свой конструктор по умолчанию.
Если я не могу, то есть на то причины. Логично было бы считать, что именно в нем происходит инициализация полей, иначе зачем он нужен? (Если ошибаюсь, поправьте.)
0
Модератор
7992 / 5591 / 1622
Регистрация: 21.04.2018
Сообщений: 16,728
Записей в блоге: 2
11.10.2018, 16:43 4
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Если я не могу, то есть на то причины. Логично было бы считать, что именно в нем происходит инициализация полей, иначе зачем он нужен? (Если ошибаюсь, поправьте.)
Логичнее считать, что после него значения полей инициализированы, а делает это он сам или до него это происходит - разницы нет.

Добавлено через 5 минут
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Если я не могу, то есть на то причины.
Причина одна - это запрещено самим языком. Потому что, при многих схожестях структуры и класса - есть принципиальное их отличие. Структура - это ЗНАЧИМЫЙ тип, класс - это ССЫЛОЧНЫЙ тип. Структуры передаются по значению, объекты класса - по ссылке. Если вмешаться в работу конструктора по умолчания для структуры, то могут быть проблемы при создании передаваемой как значения структуры.
0
Супер-модератор
Эксперт .NET
12661 / 10367 / 4319
Регистрация: 17.03.2014
Сообщений: 20,875
Записей в блоге: 1
11.10.2018, 16:53 5
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Логично было бы считать, что именно в нем происходит инициализация полей, иначе зачем он нужен?
Необязательно. Конструктор по умолчанию структуры может вообще не вызываться. Например при выделении памяти под массив. Но элементы тем не менее получают значения по умолчанию. Значит инициализация происходит до конструктора.
0
1106 / 778 / 218
Регистрация: 15.08.2010
Сообщений: 2,157
11.10.2018, 16:59 6
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Конструктор по умолчанию структуры может вообще не вызываться
тогда возникает вопрос, какая разница вызовется он или нет? и в чем тогда смысл его вызова, если он опционален?
0
Супер-модератор
Эксперт .NET
12661 / 10367 / 4319
Регистрация: 17.03.2014
Сообщений: 20,875
Записей в блоге: 1
11.10.2018, 17:18 7
КОП, я пытался описать ситуацию с точки зрения логики. По факту конструктора по умолчанию у структуры нет и правила языка запрещают его объявлять.
0
Эксперт .NET
14582 / 11008 / 2903
Регистрация: 17.09.2011
Сообщений: 18,530
11.10.2018, 17:20 8
Лучший ответ Сообщение было отмечено Соколиный глаз как решение

Решение

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

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

Цитата Сообщение от КОП Посмотреть сообщение
какая разница вызовется он или нет? и в чем тогда смысл его вызова, если он опционален?
Вот поэтому дефолтный конструктор в структуре и нельзя переопределить: структуру можно создать и без его вызова, в отличие от класса.
0
1106 / 778 / 218
Регистрация: 15.08.2010
Сообщений: 2,157
11.10.2018, 17:21 9
начал копать, оказывается new A() заменяется на default(A), конструктор там (вроде как) не вызывается, но тогда если его переопределить, то вызовется переопределенный конструктор или default(A)?

предупреждая вопросы про переопределять (надеюсь актуальная инфа в статье)
https://codeblog.jonskeet.uk/2... structors/
0
Эксперт .NET
14582 / 11008 / 2903
Регистрация: 17.09.2011
Сообщений: 18,530
11.10.2018, 17:23 10
Цитата Сообщение от КОП Посмотреть сообщение
но тогда если его переопределить, то вызовется переопределенный конструктор или default(A)?
А вы попробуйте для начала его переопределить
Узнаете о себе много нового от компилятора!
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
11.10.2018, 17:27  [ТС] 11
Потому что точно так же и у классов
Значит инициализация происходит до конструктора.
Что-то не то... Окончательный ответ как я понимаю таков: поля классов и структур инициализируются до вызова конструктора значениями по умолчанию.

Добавлено через 1 минуту
Вот поэтому дефолтный конструктор в структуре и нельзя переопределить: структуру можно создать и без его вызова, в отличие от класса.
Если я явно определяю конструктор с одним и более параметров в структуре, то также как и в классе конструктор по умолчанию не создается?
0
1106 / 778 / 218
Регистрация: 15.08.2010
Сообщений: 2,157
11.10.2018, 17:27 12
Цитата Сообщение от kolorotur Посмотреть сообщение
А вы попробуйте для начала его переопределить
Узнаете о себе много нового от компилятора!
в приведенной статье вроде получилось. То есть если я использую reference.dll сначала с дефолтным конструктором, который c# переведет в default(a), а потом заменю dll на ту в которой есть переопределенный конструктор, то какое мне поведение ожидать без перекомпиляции c# кода?
0
Эксперт .NET
14582 / 11008 / 2903
Регистрация: 17.09.2011
Сообщений: 18,530
11.10.2018, 17:37 13
Цитата Сообщение от КОП Посмотреть сообщение
в приведенной статье вроде получилось.
В приведенной статье не переопределяется конструктор по умолчанию.
0
1106 / 778 / 218
Регистрация: 15.08.2010
Сообщений: 2,157
11.10.2018, 17:40 14
Цитата Сообщение от kolorotur Посмотреть сообщение
В приведенной статье не переопределяется конструктор по умолчанию.
тогда можете пояснить что там происходит? вроде конструктор без параметров у структуры определен и пишет в консоль.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
11.10.2018, 17:47  [ТС] 15
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Если я явно определяю конструктор с одним и более параметров в структуре, то также как и в классе конструктор по умолчанию не создается?
Жду ответа...
0
Эксперт .NET
14582 / 11008 / 2903
Регистрация: 17.09.2011
Сообщений: 18,530
11.10.2018, 17:53 16
Цитата Сообщение от КОП Посмотреть сообщение
тогда можете пояснить что там происходит?
Конструктор по умолчанию у структур есть всегда, вне зависимости от того, определен ли конструктор с параметрами.
Конструктор по умолчанию так же невозможно определить явно — это будет ошибкой компиляции.

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Жду ответа...
Цитируйте ответ кнопкой "цитата", пожалуйста — тогда приходит уведомление, что кто-то в теме обратился.
Иначе легко пропустить сообщения.

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

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Если я явно определяю конструктор с одним и более параметров в структуре, то также как и в классе конструктор по умолчанию не создается?
Нет, конструктор по умолчанию у структуры есть всегда.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
11.10.2018, 18:00  [ТС] 17
Цитата Сообщение от kolorotur Посмотреть сообщение
Нет, конструктор по умолчанию у структуры есть всегда.
А что располагается внутри этого конструктора, если поля инициализируются до его вызова?
0
Модератор
7992 / 5591 / 1622
Регистрация: 21.04.2018
Сообщений: 16,728
Записей в блоге: 2
11.10.2018, 18:01 18
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Жду ответа...
Он уже создан, до того как Вы определили свой конструктор. И убрать, скрыть его нельзя.

Добавлено через 51 секунду
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
А что располагается внутри этого конструктора, если поля инициализируются до его вызова?
То же самое что и в безпараметрическом конструкторе класса.
0
Alvin Seville
332 / 265 / 131
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
11.10.2018, 18:02  [ТС] 19
Цитата Сообщение от Элд Хасп Посмотреть сообщение
То же самое что и в безпараметрическом конструкторе класса.
То есть?
0
Модератор
7992 / 5591 / 1622
Регистрация: 21.04.2018
Сообщений: 16,728
Записей в блоге: 2
11.10.2018, 18:06 20
То есть в пользовательском смысле, он пустой.

Добавлено через 1 минуту
C#
1
public MyStruct () {}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2018, 18:06

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

Инициализация статических полей
Ковыряю legacy код, возможно нубский вопрос:( Есть глобальный класс со статическими полями и...

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

Обращение и инициализация полей класса
привет! помогите пожалуйста разобраться, как это работает. нужно понять что просходит под...

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


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

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

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