Alvin Seville
|
|
1 | |
Инициализация полей структур11.10.2018, 16:00. Просмотров 2469. Ответов 45
Метки нет Все метки)
(
Насколько знаю, у экземпляров классов поля всегда инициализируются значениями по умолчанию перед тем как в дело вступает конструктор. Почему у структур для инициализации полей используется конструктор по умолчанию для этих целей?
0
|
|
11.10.2018, 16:00 | |
Инициализация массива структур Инициализация структуры содержащей массив структур Не происходит инициализация полей
|
|
![]() 14697 / 11111 / 2919
Регистрация: 17.09.2011
Сообщений: 18,650
|
|
11.10.2018, 18:12 | 22 |
0
|
Alvin Seville
|
|
11.10.2018, 18:16 [ТС] | 23 |
kolorotur, а зачем вообще дефолтный конструктор структуре, если она им не пользуется?
![]() Код
var x = new StructName();
0
|
Модератор
|
||||||
11.10.2018, 18:32 | 24 | |||||
При объявлении переменой значимого типа, в том числе структуры, под неё выделяется память. Конструктор тогда не вызывается. Если надо создать экземпляр без объявления переменной, то тогда вызывается конструктор и создаётся область памяти под эту структуру.
0
|
![]() 14697 / 11111 / 2919
Регистрация: 17.09.2011
Сообщений: 18,650
|
|
11.10.2018, 18:36 | 25 |
Чтобы всегда имелась возможность проинициализировать переменную, имеющую тип этой струтуры.
Структуры ведь значимые типы — экземпляр хранится в переменной. Обязательное наличие дефолтного конструктора исключает нежданчики вроде создания массива этих структур: массив — это набор переменных, значит при его инициализации переменные должны иметь какое-то значение. А какое, если у данной структуры нет дефолтного конструктора? А вот это-то и невозможно!
0
|
Alvin Seville
|
|
11.10.2018, 18:45 [ТС] | 28 |
А почему у классов конструктор по умолчанию определяется лишь тогда когда нет другого конструктора явно определенного с параметрами? Разве не может потребоваться просто так создать объект класса через конструктор по умолчанию?
![]()
0
|
![]() 14697 / 11111 / 2919
Регистрация: 17.09.2011
Сообщений: 18,650
|
|
11.10.2018, 18:46 | 29 |
Формально — да.
Но представьте, что у вас в конструкторе по умолчанию имеется какой-то код инициализации: тогда ведь при создании массива на 100500 элементов придется делать 100500 вызовов этих конструкторов! А если конструктор по умолчанию переопределить нельзя, то создание массива становится очень простым: выделяем память и зануляем все значения — это и соответствует правилам выделения памяти (обнулять перед использованием), и правилам инициализации экземпляров. С одной стороны формально конструктор вроде как вызвался 100500 раз — наблюдается тот же эффект, а с другой эти вызовы делать не пришлось, потому что он пустой и никто этого изменить не может.
0
|
11.10.2018, 18:46 | 30 |
В C# не существует возможности определить конструктор по умолчанию для Value Types.
Я хз, что там будет если внаглую из MSIL попробовать дернуть безпараметрический конструктор, но через c# точно не дернуть. Именно потому что его нельзя вызвать из C#, его и объявить в C# нельзя. Нет, никакие конструкторы вызываться не должны, ибо объекты при выделении массива не порождаются. И тут тоже нет.
0
|
![]() 14697 / 11111 / 2919
Регистрация: 17.09.2011
Сообщений: 18,650
|
|
11.10.2018, 18:47 | 31 |
Чтобы писанины меньше было.
Правила инициализации для переменных ссылочных типов другие, потому можно как запретить создание конструктора по умолчанию, так и переопределить его поведение.
0
|
![]() 14697 / 11111 / 2919
Регистрация: 17.09.2011
Сообщений: 18,650
|
|
11.10.2018, 18:48 | 33 |
1
|
1108 / 779 / 219
Регистрация: 15.08.2010
Сообщений: 2,159
|
|
11.10.2018, 18:50 | 34 |
у меня так только в дебаге, в релизе сразу в нужную пишет послее ее инициализации дефолтом
0
|
Модератор
|
|
11.10.2018, 18:58 | 37 |
Это, если у Вас идёт прямая инициализация. А если вы создаёте структуру в методе и потом её возвращаете или она создаётся в LINQ! Да, мало ли ещё способов.... Суть не в этом. При присваивании значимых типов копируются участки памяти. Но переменная всегда ссылается на один и тот же участок памяти.
0
|
1108 / 779 / 219
Регистрация: 15.08.2010
Сообщений: 2,159
|
|
11.10.2018, 19:02 | 38 |
я конкретно про ваш код говорил, остальное то понятно. Просто я не ожидал что в дебаге будет лишняя временная переменная, а в релизе (ожидаемо) её уже нет
0
|
11.10.2018, 19:13 | 39 | |||||
Но как бэ все равно никакой дефолтный конструктор не вызывается.
Код
IL_0000: nop IL_0001: ldloca.s x1 IL_0003: initobj TestConsoleApp1.MyStruct IL_0009: ldloca.s x2 IL_000b: ldc.i4.2 IL_000c: call instance void TestConsoleApp1.MyStruct::.ctor(int32) IL_0011: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() IL_0016: pop IL_0017: ret Странно это все.
0
|
1108 / 779 / 219
Регистрация: 15.08.2010
Сообщений: 2,159
|
|
11.10.2018, 19:18 | 40 |
Cupko, можете ещё через Activator.CreateInstance попробовать, я там не смог разобраться в коде доходит ли до конструктора
0
|
11.10.2018, 19:18 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Инициализация статических полей
Обращение и инициализация полей класса
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |