Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
Alvin Seville
 Аватар для Соколиный глаз
346 / 276 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

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

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

Студворк — интернет-сервис помощи студентам
Насколько знаю, у экземпляров классов поля всегда инициализируются значениями по умолчанию перед тем как в дело вступает конструктор. Почему у структур для инициализации полей используется конструктор по умолчанию для этих целей?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2018, 16:00
Ответы с готовыми решениями:

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

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

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

45
Alvin Seville
 Аватар для Соколиный глаз
346 / 276 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
11.10.2018, 18:06  [ТС]
Студворк — интернет-сервис помощи студентам
Элд Хасп, а в непользовательском?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.10.2018, 18:12
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
А что располагается внутри этого конструктора, если поля инициализируются до его вызова?
Ничего, он пуст.
0
Alvin Seville
 Аватар для Соколиный глаз
346 / 276 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
11.10.2018, 18:16  [ТС]
kolorotur, а зачем вообще дефолтный конструктор структуре, если она им не пользуется? Ну, какой смысл, разве что писать
Code
1
var x = new StructName();
? Я всё понять этого не могу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
11.10.2018, 18:32
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
а в непользовательском?
При объявлении переменой значимого типа, в том числе структуры, под неё выделяется память. Конструктор тогда не вызывается. Если надо создать экземпляр без объявления переменной, то тогда вызывается конструктор и создаётся область памяти под эту структуру.
C#
1
2
3
4
MeStruct inst; // Выделена память и к ней можно обращаться по имени переменной.
inst = new MeStruct() {Field1="Value"} ; // Выделена память под новую структуру, 
// записано значение в одно из полей этой структуры, 
// участок памяти структуры скопирован на участок памяти переменной.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.10.2018, 18:36
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
а зачем вообще дефолтный конструктор структуре, если она им не пользуется?
Чтобы всегда имелась возможность проинициализировать переменную, имеющую тип этой струтуры.
Структуры ведь значимые типы — экземпляр хранится в переменной.
Обязательное наличие дефолтного конструктора исключает нежданчики вроде создания массива этих структур: массив — это набор переменных, значит при его инициализации переменные должны иметь какое-то значение. А какое, если у данной структуры нет дефолтного конструктора? А вот это-то и невозможно!
0
Alvin Seville
 Аватар для Соколиный глаз
346 / 276 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
11.10.2018, 18:41  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
А какое, если у данной структуры нет дефолтного конструктора?
Тогда, получается он вызывается при создании массива.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
11.10.2018, 18:43
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Тогда, получается он вызывается при создании массива.
Не только. Когда надо создать неименованный экземпляр.
0
Alvin Seville
 Аватар для Соколиный глаз
346 / 276 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
11.10.2018, 18:45  [ТС]
А почему у классов конструктор по умолчанию определяется лишь тогда когда нет другого конструктора явно определенного с параметрами? Разве не может потребоваться просто так создать объект класса через конструктор по умолчанию?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.10.2018, 18:46
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Тогда, получается он вызывается при создании массива.
Формально — да.
Но представьте, что у вас в конструкторе по умолчанию имеется какой-то код инициализации: тогда ведь при создании массива на 100500 элементов придется делать 100500 вызовов этих конструкторов!
А если конструктор по умолчанию переопределить нельзя, то создание массива становится очень простым: выделяем память и зануляем все значения — это и соответствует правилам выделения памяти (обнулять перед использованием), и правилам инициализации экземпляров.
С одной стороны формально конструктор вроде как вызвался 100500 раз — наблюдается тот же эффект, а с другой эти вызовы делать не пришлось, потому что он пустой и никто этого изменить не может.
0
 Аватар для Cupko
660 / 597 / 171
Регистрация: 17.07.2012
Сообщений: 1,686
Записей в блоге: 1
11.10.2018, 18:46
В C# не существует возможности определить конструктор по умолчанию для Value Types.
Я хз, что там будет если внаглую из MSIL попробовать дернуть безпараметрический конструктор, но через c# точно не дернуть. Именно потому что его нельзя вызвать из C#, его и объявить в C# нельзя.
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Тогда, получается он вызывается при создании массива.
Нет, никакие конструкторы вызываться не должны, ибо объекты при выделении массива не порождаются.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Когда надо создать неименованный экземпляр.
И тут тоже нет.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.10.2018, 18:47
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
А почему у классов конструктор по умолчанию определяется лишь тогда когда нет другого конструктора явно определенного с параметрами?
Чтобы писанины меньше было.

Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Разве не может потребоваться просто так создать объект класса?
Правила инициализации для переменных ссылочных типов другие, потому можно как запретить создание конструктора по умолчанию, так и переопределить его поведение.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
11.10.2018, 18:48
Цитата Сообщение от Cupko Посмотреть сообщение
И тут тоже нет.
А это как тогда назвать?
C#
1
inst = new MeStruct() {Field1="Value"} ;
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
11.10.2018, 18:48
Цитата Сообщение от Cupko Посмотреть сообщение
Именно потому что его нельзя вызвать из C#
Мм?
C#
1
2
3
4
5
6
struct Foo
{
   public Foo(int x);
}
 
var foo = new Foo(); // OK
1
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
11.10.2018, 18:50
Цитата Сообщение от Элд Хасп Посмотреть сообщение
// участок памяти структуры скопирован на участок памяти переменной.
у меня так только в дебаге, в релизе сразу в нужную пишет послее ее инициализации дефолтом
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
11.10.2018, 18:53
Из документации"При создании экземпляра объекта структуры с помощью используемого по умолчанию конструктора без параметров все члены назначаются согласно их значениям по умолчанию."
0
 Аватар для Cupko
660 / 597 / 171
Регистрация: 17.07.2012
Сообщений: 1,686
Записей в блоге: 1
11.10.2018, 18:54
Цитата Сообщение от kolorotur Посмотреть сообщение
Мм?
Видимо и я присоединяюсь к вопросу. Пойду посмотрю что в MSIL творится.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
11.10.2018, 18:58
Цитата Сообщение от КОП Посмотреть сообщение
у меня так только в дебаге, в релизе сразу в нужную пишет послее ее инициализации дефолтом
Это, если у Вас идёт прямая инициализация. А если вы создаёте структуру в методе и потом её возвращаете или она создаётся в LINQ! Да, мало ли ещё способов.... Суть не в этом. При присваивании значимых типов копируются участки памяти. Но переменная всегда ссылается на один и тот же участок памяти.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
11.10.2018, 19:02
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Это, если у Вас идёт прямая инициализация. А если вы создаёте структуру в методе и потом её возвращаете или она создаётся в LINQ!
я конкретно про ваш код говорил, остальное то понятно. Просто я не ожидал что в дебаге будет лишняя временная переменная, а в релизе (ожидаемо) её уже нет
0
 Аватар для Cupko
660 / 597 / 171
Регистрация: 17.07.2012
Сообщений: 1,686
Записей в блоге: 1
11.10.2018, 19:13
Цитата Сообщение от kolorotur Посмотреть сообщение
Мм?
Но как бэ все равно никакой дефолтный конструктор не вызывается.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    struct MyStruct
    {
        int Field;
 
        internal MyStruct(int field)
        {
            Field = field;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            var x1 = new MyStruct();
 
            var x2 = new MyStruct(2);
 
            Console.ReadKey();
        }
    }
Code
1
2
3
4
5
6
7
8
9
  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
Абсолютный эквивалент default(T).
Странно это все.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
11.10.2018, 19:18
Cupko, можете ещё через Activator.CreateInstance попробовать, я там не смог разобраться в коде доходит ли до конструктора
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2018, 19:18

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru