Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > struct и иницилизация


Автор: DenWPF 16.4.2011, 12:08
на данный код заругается компилятор, так требуется инициализации всех полей явно если существует конструктор явный.
Код

    internal struct SomeValtype
    {
        private Int32 m_x, m_y;

        public SomeValtype(Int32 x)
        {
            m_x = x;
        }
    }


в книге говориться что нужно инициализировать все поля.


будет ли правильно сделать так:

Код

    internal struct SomeValtype
    {
        private Int32 m_x, m_y;

        public SomeValtype(Int32 x) : this()
        {
            m_x = x;
        }
    }


не чего не нарушу я, таким способом ?

Автор: Rohoss 16.4.2011, 13:58
Цитата(DenWPF @  16.4.2011,  12:08 Найти цитируемый пост)
не чего не нарушу я, таким способом ? 


1. ключевое слово 
Цитата(DenWPF @  16.4.2011,  12:08 Найти цитируемый пост)
: this()

тут лишнее

2. У меня компилируется и без инициализации полей (и у тебя кстати тоже, потому что переменная m_y нигде не инициализируется). Но всё равно правильно будет их инициализировать. 

3. Не по стандартам пишешь
Цитата(DenWPF @  16.4.2011,  12:08 Найти цитируемый пост)
 private Int32 m_x, m_y;

каждое поле в отдельной строке надо  smile 

Автор: DenWPF 16.4.2011, 14:01
Если убрать this будет ошибка компиляции "Field 'Object_1.SomeValtype.m_y' must be fully assigned before control is returned to the caller    "


Цитата

каждое поле в отдельной строке надо


это с точки производительности, или читаемости кода?

Автор: Rohoss 16.4.2011, 14:06
Цитата(DenWPF @  16.4.2011,  14:01 Найти цитируемый пост)
или читаемости кода?

Читаемости! Это более важный параметр нежели производительность, которая ИМХО, здесь тоже не страдает

Добавлено через 1 минуту и 51 секунду
Цитата(DenWPF @  16.4.2011,  14:01 Найти цитируемый пост)
Если убрать this будет ошибка компиляции "Field 'Object_1.SomeValtype.m_y' must be fully assigned before control is returned to the caller    "

ну в таком случае нужно инициализировать все поля  smile 

Автор: DenWPF 16.4.2011, 14:33
А в чем ты компилируешь, что у тебя работает?

Автор: Rohoss 16.4.2011, 14:48
vs2010 .net 4.0

Работает
Код

        private Int32 m_x, m_y;
        public SomeValtype(Int32 x)
        {
            m_x = x;
            m_y = x;
        }

Не работает
Код

    internal struct SomeValtype
    {
        private Int32 m_x, m_y;
        public SomeValtype(Int32 x)
        {
            //m_x = x;
            m_y = x;
        }
    }

Работает
Код

    internal struct SomeValtype
    {
        private Int32 m_x, m_y;
        public SomeValtype(Int32 x):this()
        {
            //m_x = x;
            m_y = x;
        }
    }

Автор: Экскалупатор 16.4.2011, 15:09
Цитата(DenWPF @  16.4.2011,  11:08 Найти цитируемый пост)
 public SomeValtype(Int32 x) : this()
        {
            m_x = x;
        }

так у тебя вызывается конструктор по умолчанию, который таки инициализирует все что у тебя объявлено, а потом вызывается этот конкретный конструктор с параметром, который в свою очередь дополнительно задает параметр, получается одно лишнее действие.

Автор: DenWPF 16.4.2011, 15:21
ок, я понял. лучше через this так как если у меня появиться ещё одно поле, то его нужно будет инициализировать в конструкторах, а так я себя обезопасил, хотя и затратил чуть больше ресурсов.

Автор: Экскалупатор 16.4.2011, 15:27
ммм, не уверен применимо ли это к структурам(хотя какая в сути разница), но у рихтера есть интересный выход, он предлагает всю инициализацию сводить в один конструктор с наибольшим числом параметров, и вызывать этот конструктор из других, дополняя недостающие параметры значениями по умолчанию. к примеру:
Код

    class ctr
    {
        private int a, b;
        public ctr():this(0, 0)
        {
        }
        public ctr(int x):this(x, 0)
        {
        }
        public ctr(int x, int y)
        {
            this.a = x;
            this.b = y;
        }
    }

в твоем случае сложность в том что в структурах нельзя сделать свой конструктор без параметров(есть повод задуматься что бы сделать вместо структуры класс).

Автор: DenWPF 16.4.2011, 15:38
да конечно применимо, только вот если будет много полей, не совсем удобно будет так делать.

хотя с другой стороны, если много полей, значит много раз будет перезаписываться и ещё больше работы если использовать this().

в общем если не лень то лучше создавать главный инициализирующий конструктор.

Автор: Экскалупатор 16.4.2011, 15:45
Цитата(DenWPF @  16.4.2011,  14:38 Найти цитируемый пост)
в общем если не лень то лучше создавать главный инициализирующий конструктор. 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)