Alvin Seville
|
|
1 | |
Инициализация полей структур11.10.2018, 16:00. Просмотров 2391. Ответов 45
Метки нет Все метки)
(
Насколько знаю, у экземпляров классов поля всегда инициализируются значениями по умолчанию перед тем как в дело вступает конструктор. Почему у структур для инициализации полей используется конструктор по умолчанию для этих целей?
0
|
|
11.10.2018, 16:00 | |
Инициализация массива структур Инициализация структуры содержащей массив структур Не происходит инициализация полей
|
|
Модератор
|
|
11.10.2018, 16:33 | 2 |
А как Вы проверили это утверждение? Вы же не можете для структуры создать свой конструктор по умолчанию. И проверить до него происходит инициализация или он сам инициализирует.
0
|
Alvin Seville
|
|
11.10.2018, 16:35 [ТС] | 3 |
Если я не могу, то есть на то причины. Логично было бы считать, что именно в нем происходит инициализация полей, иначе зачем он нужен? (Если ошибаюсь, поправьте.)
0
|
Модератор
|
|
11.10.2018, 16:43 | 4 |
Логичнее считать, что после него значения полей инициализированы, а делает это он сам или до него это происходит - разницы нет.
Добавлено через 5 минут Причина одна - это запрещено самим языком. Потому что, при многих схожестях структуры и класса - есть принципиальное их отличие. Структура - это ЗНАЧИМЫЙ тип, класс - это ССЫЛОЧНЫЙ тип. Структуры передаются по значению, объекты класса - по ссылке. Если вмешаться в работу конструктора по умолчания для структуры, то могут быть проблемы при создании передаваемой как значения структуры.
0
|
Супер-модератор
![]() |
|
11.10.2018, 16:53 | 5 |
Необязательно. Конструктор по умолчанию структуры может вообще не вызываться. Например при выделении памяти под массив. Но элементы тем не менее получают значения по умолчанию. Значит инициализация происходит до конструктора.
0
|
1106 / 778 / 218
Регистрация: 15.08.2010
Сообщений: 2,157
|
|
11.10.2018, 16:59 | 6 |
тогда возникает вопрос, какая разница вызовется он или нет? и в чем тогда смысл его вызова, если он опционален?
0
|
![]() 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
|
![]() 14582 / 11008 / 2903
Регистрация: 17.09.2011
Сообщений: 18,530
|
|
11.10.2018, 17:23 | 10 |
А вы попробуйте для начала его переопределить
![]() Узнаете о себе много нового от компилятора!
0
|
Alvin Seville
|
|
11.10.2018, 17:27 [ТС] | 11 |
![]() Добавлено через 1 минуту
0
|
1106 / 778 / 218
Регистрация: 15.08.2010
Сообщений: 2,157
|
|
11.10.2018, 17:27 | 12 |
в приведенной статье вроде получилось. То есть если я использую reference.dll сначала с дефолтным конструктором, который c# переведет в default(a), а потом заменю dll на ту в которой есть переопределенный конструктор, то какое мне поведение ожидать без перекомпиляции c# кода?
0
|
![]() 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 |
тогда можете пояснить что там происходит? вроде конструктор без параметров у структуры определен и пишет в консоль.
0
|
![]() 14582 / 11008 / 2903
Регистрация: 17.09.2011
Сообщений: 18,530
|
|
11.10.2018, 17:53 | 16 |
Конструктор по умолчанию у структур есть всегда, вне зависимости от того, определен ли конструктор с параметрами.
Конструктор по умолчанию так же невозможно определить явно — это будет ошибкой компиляции. Цитируйте ответ кнопкой "цитата", пожалуйста — тогда приходит уведомление, что кто-то в теме обратился. Иначе легко пропустить сообщения. Да. Нет, конструктор по умолчанию у структуры есть всегда.
0
|
Модератор
|
|
11.10.2018, 18:01 | 18 |
Он уже создан, до того как Вы определили свой конструктор. И убрать, скрыть его нельзя.
Добавлено через 51 секунду То же самое что и в безпараметрическом конструкторе класса.
0
|
Модератор
|
||||||
11.10.2018, 18:06 | 20 | |||||
То есть в пользовательском смысле, он пустой.
Добавлено через 1 минуту
0
|
11.10.2018, 18:06 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Инициализация статических полей
Обращение и инициализация полей класса
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |