none
C# 6.0 RRS feed

  • Вопрос

  • Ссылка 1

    Ссылка 2

    Добрый день!

    Подскажите, пожалуйста, что подразумевается под резервным полем в статье по ссылке 1? Как его создать?

    Почему в статье по ссылке 1 не рекомендуется использовать автоматически реализуемые свойства, если я могу выполнить следующий код?

    struct A
            {
                public int b { get; set; }
    
                public A(int i)
                {
                    b = i;
                }
            }
    
     static int Main(string[] args)
            {
                A c=new A(1);
                Console.WriteLine(c.b);
    }

    Почему нельзя создавать конструктор структуры без параметров?

    Почему в статье по ссылке 2 создание массива структур из 1000 объектов экономит память по сравнению с классами? За счет чего (что хранится, кроме ссылок, при создании классов?)?

    Что имеется в виду в предложении статьи 2 "<sentencetext xmlns="http://www.w3.org/1999/xhtml">Ошибкой также является инициализация поля экземпляра в основной части структуры.</sentencetext><sentencetext xmlns="http://www.w3.org/1999/xhtml"></sentencetext>"?

    Заранее благодарен.

    11 апреля 2016 г. 8:45

Ответы

  • > что подразумевается под резервным полем?

    // Автосвойство
    // Резервное поле будет сгенерировано автоматически компилятором
    public int Prop1 { get; set; }
    
    
    
    // Резервное поле для свойства
    private int field;
    
    // Свойство, работающее с этим полем
    public int Prop2
    {
        get { return field; }
        set { field = value; }
    }

    Работа напрямую с этим полем происходит быстрее.

    > Почему нельзя создавать конструктор структуры без параметров?

    Чисто теоретически, можно создать конструктор без параметров. В некоторых языках для платформы .NET так и сделано. Можете почитать обсуждение на rsdn и статью там по ссылке.

    Одна из причин, почему так сделано: чтобы избежать непреднамеренного выполнения кода в конструкторах при создании большого массива структур. В-общем, перестраховались разработчики Шарпа.

    > Почему создание массива структур экономит память по сравнению с классами?

    Структура содержит только сами значения.

    Класс имеет заголовок размером 8 байт на 32-битной системе и 16 на 64-битной. Плюс размер ссылки на экземпляр класса (4 байта на 32-битной системе и 8 на 64-битной).

    Таким образом, структура

    struct Coord
    {
        public int x, y;
    }

    будет иметь размер 8 байтов (два поля по 4 байта).

    А класс

    class Coord
    {
        public int x, y;
    }

    будет иметь размер 20 байт на 32-битной системе (8 на поля, 8 на заголовок, 4 на ссылку) и 32 байта на 64-битной системе (8 на поля, 16 на заголовок, 8 на ссылку).
    11 апреля 2016 г. 16:59

Все ответы

  • В c# 6.0 автоматически реализуемые свойства разрешены до этого не разрешалось потому что то поле(резервное поле) на каторое указывает автоматически реализуемое свойства невозможно было инициализировать из конструктора

    Конструктор без параметров на самом деле существует неявно просто его невозможно переоприделить он выполняет побитовое обнуление всех полей структуры.

    Поскольку структура это значимый тип  то не требуется создания обьекта в куче (класс=ссылка в стеке+обьект в куче , структура =  значение в стеке ) по этому  массива структур из 1000 объектов экономит память по сравнению с классами


    • Изменено Azat Tazayan 11 апреля 2016 г. 15:55
    11 апреля 2016 г. 15:54
  • > что подразумевается под резервным полем?

    // Автосвойство
    // Резервное поле будет сгенерировано автоматически компилятором
    public int Prop1 { get; set; }
    
    
    
    // Резервное поле для свойства
    private int field;
    
    // Свойство, работающее с этим полем
    public int Prop2
    {
        get { return field; }
        set { field = value; }
    }

    Работа напрямую с этим полем происходит быстрее.

    > Почему нельзя создавать конструктор структуры без параметров?

    Чисто теоретически, можно создать конструктор без параметров. В некоторых языках для платформы .NET так и сделано. Можете почитать обсуждение на rsdn и статью там по ссылке.

    Одна из причин, почему так сделано: чтобы избежать непреднамеренного выполнения кода в конструкторах при создании большого массива структур. В-общем, перестраховались разработчики Шарпа.

    > Почему создание массива структур экономит память по сравнению с классами?

    Структура содержит только сами значения.

    Класс имеет заголовок размером 8 байт на 32-битной системе и 16 на 64-битной. Плюс размер ссылки на экземпляр класса (4 байта на 32-битной системе и 8 на 64-битной).

    Таким образом, структура

    struct Coord
    {
        public int x, y;
    }

    будет иметь размер 8 байтов (два поля по 4 байта).

    А класс

    class Coord
    {
        public int x, y;
    }

    будет иметь размер 20 байт на 32-битной системе (8 на поля, 8 на заголовок, 4 на ссылку) и 32 байта на 64-битной системе (8 на поля, 16 на заголовок, 8 на ссылку).
    11 апреля 2016 г. 16:59