Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> struct и иницилизация 
V
    Опции темы
DenWPF
Дата 16.4.2011, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



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

    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;
        }
    }


не чего не нарушу я, таким способом ?
PM MAIL   Вверх
Rohoss
Дата 16.4.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



Цитата(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 



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
DenWPF
Дата 16.4.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



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


Цитата

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


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

Это сообщение отредактировал(а) DenWPF - 16.4.2011, 14:01
PM MAIL   Вверх
Rohoss
Дата 16.4.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



Цитата(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 


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
DenWPF
Дата 16.4.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



А в чем ты компилируешь, что у тебя работает?
PM MAIL   Вверх
Rohoss
Дата 16.4.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



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;
        }
    }



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Экскалупатор
Дата 16.4.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



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

так у тебя вызывается конструктор по умолчанию, который таки инициализирует все что у тебя объявлено, а потом вызывается этот конкретный конструктор с параметром, который в свою очередь дополнительно задает параметр, получается одно лишнее действие.
PM MAIL ICQ   Вверх
DenWPF
Дата 16.4.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



ок, я понял. лучше через this так как если у меня появиться ещё одно поле, то его нужно будет инициализировать в конструкторах, а так я себя обезопасил, хотя и затратил чуть больше ресурсов.
PM MAIL   Вверх
Экскалупатор
Дата 16.4.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



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

    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;
        }
    }

в твоем случае сложность в том что в структурах нельзя сделать свой конструктор без параметров(есть повод задуматься что бы сделать вместо структуры класс).
PM MAIL ICQ   Вверх
DenWPF
Дата 16.4.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



да конечно применимо, только вот если будет много полей, не совсем удобно будет так делать.

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

в общем если не лень то лучше создавать главный инициализирующий конструктор.
PM MAIL   Вверх
Экскалупатор
Дата 16.4.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



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

тут дело даже не в кошерности такого подхода. просто в данном случае весь код инициализации собран в одном месте, и если какой вопрос то сразу видно где искать, упрощает работу в будущем. конструкторы все равно писать придется(в зависимости от задачи), а коль уж этого не избежать то на мой взгляд такой подход будет логичнее и проще, чем в каждом конструкторе писать один и тот же код(возможно просто копипастой). плюс, конечно же, нет лишних инициализаций переменных.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.