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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свойства компонента - это же просто? 
:(
    Опции темы
setnull
  Дата 3.7.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

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



Люд, представьте себе следующую ситуацию:

Компонент

{
...
        private bool _active = false;
        public bool Active
        {
            get { return GetActive(); }
            set { SetActive(value); }
        }
        protected bool GetActive()
        {
            return _active;
        }
...
}

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

            if (this.ServerSocket1.Active)
                lbCCount.Text = String.Format("Active. Conections: {0}", this.ServerSocket1.ConectionCount);
            else
                lbCCount.Text = "Inactive";

в случаях Active == false работает нормально. При true - ничё не происходит smile  
При трассировке, на свойство Active говорит

Name       Value             
Active    Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.

Хотя, если ПЕРЕД ифом кинуть че-нить вроде
MessageBox.Show(String.Format("Active: {0}, {1}", act, this.ServerSocket1.ConectionCount));
,  то выведет

"Active: True, 1"  smile 

Мало того - это все в рамках Visual Studio. Если выполнять непосредственно exe-шник - все работает...
I  smile  MS
PM MAIL   Вверх
emmanuil
Дата 4.7.2007, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

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



        private bool _active = false;
        public bool Active
        {
            get { return GetActive(); }
            set { SetActive(value); }
        }
        protected bool GetActive()
        {
            return _active;
        }

Уже же есть методы get и set в свойстве. Либо тогда вообще не используй свойство, а только методы, тогда будет в стиле Java.

PM MAIL   Вверх
Zakonnic
Дата 4.7.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 25.4.2006

Репутация: 2
Всего: 6



Цитата(setnull @  3.7.2007,  12:31 Найти цитируемый пост)
Мало того - это все в рамках Visual Studio. Если выполнять непосредственно exe-шник - все работает...
I  smile  MS 
Гхм... Если все работает, тогда в чем проблема? Это ж дебагер, там есть свои ограничения, и думаю люди из всеми нами безусловно любимого MS их не просто так впихнули. Кстати, предыдущий товарищ прав - логично писать 

        public bool Active
        {
            get { return _active; }
        }

--------------------
...и никогда не пишите в комментариях правду
PM MAIL ICQ   Вверх
Exception
Дата 4.7.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Погуглить было очень трудно?
Вот вам и ответ на поставленный вопрос.
По сути, достаточно лишь представить себе как работает отладчик. Вот вы навели курсор на свойство объекта и хотите посмотреть его значение.. Как студии его вычислить, чтобы потом отобразить? В большинстве случаев всё банально: если getter просто возвращает какое-то поле класса, студия об этом "догадывается" и отображает это поле, минуя выполнение getter-а.
Если же getter возвращает что-то хоть чуточку более сложное, метод-аксессор всё-таки придётся выполнить. Но как? Ведь getter находится в вашем коде, а сейчас отладчик стоит на конкретной строчке этого кода и не может вдруг броситься выполнять какой-то метод, чтобы узнать значение свойства. Выполнить метод в другом потоке по понятным причинам нельзя. Вот вам и ошибка.
PM   Вверх
setnull
Дата 4.7.2007, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

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



Цитата(emmanuil @ 4.7.2007,  08:52)
private bool _active = false;
        public bool Active
        {
            get { return GetActive(); }
            set { SetActive(value); }
        }
        protected bool GetActive()
        {
            return _active;
        }

Уже же есть методы get и set в свойстве. Либо тогда вообще не используй свойство, а только методы, тогда будет в стиле Java.

Ну по порядочку...

2emmanuil (почти теска)

private bool _active = false;

На данный момент это просто эМУЛЯЖ...

На самом деле логика GetActive() намного сложнее... Просто, когда я изначально столкнулся с таким беспределом, подумал, может это из-за lockов и потоков там ких-нить... Для проверки - вот, все равно... 
PM MAIL   Вверх
setnull
Дата 4.7.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

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



Цитата(Zakonnic @ 4.7.2007,  12:12)
Цитата(setnull @  3.7.2007,  12:31 Найти цитируемый пост)
Мало того - это все в рамках Visual Studio. Если выполнять непосредственно exe-шник - все работает...
I  smile  MS 
Гхм... Если все работает, тогда в чем проблема? Это ж дебагер, там есть свои ограничения, и думаю люди из всеми нами безусловно любимого MS их не просто так впихнули. Кстати, предыдущий товарищ прав - логично писать 

        public bool Active
        {
            get { return _active; }
        }

2Zakonnic

Ну ничего себе... Если на это закрыть глаза ( ну да, пускай, это же .NET Framework, он ведь еще так молод...), то кААк я могу быть уверен, что он мне завтра в релизе не скжет: "Ой, [%username], прости, мол, по вторникам у меня 5 % 3  == 7..."

Хотя, постой... Что ты подрозумеваешь под "дебагер"?

С помощью трассировки, я только хотел уточнить, че там происходит...

Но и при обыкновенном выполнении кода (без трассировки, без breakpointов, просто F5)

Код

0x00       MessageBox.Show(String.Format("Active: {0}, {1}", act, this.ServerSocket1.ConectionCount));
0x01       if (this.ServerSocket1.Active)
0x02           lbCCount.Text = String.Format("Active. Conections: {0}", this.ServerSocket1.ConectionCount);
0x03       else
0x04           lbCCount.Text = "Inactive";


при значениях Active == true (это только закономерность...) отрабатывает только код строки 0х00

по поводу
    get { return _active; }
см 2emmanuil



Это сообщение отредактировал(а) setnull - 4.7.2007, 18:17
PM MAIL   Вверх
setnull
Дата 4.7.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

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



Цитата(Exception @ 4.7.2007,  14:05)
Погуглить было очень трудно?
Вот вам и ответ на поставленный вопрос.
По сути, достаточно лишь представить себе как работает отладчик. Вот вы навели курсор на свойство объекта и хотите посмотреть его значение.. Как студии его вычислить, чтобы потом отобразить? В большинстве случаев всё банально: если getter просто возвращает какое-то поле класса, студия об этом "догадывается" и отображает это поле, минуя выполнение getter-а.
Если же getter возвращает что-то хоть чуточку более сложное, метод-аксессор всё-таки придётся выполнить. Но как? Ведь getter находится в вашем коде, а сейчас отладчик стоит на конкретной строчке этого кода и не может вдруг броситься выполнять какой-то метод, чтобы узнать значение свойства. Выполнить метод в другом потоке по понятным причинам нельзя. Вот вам и ошибка.


2Exception 
Так смысл сообщения не обязятельно гуглить, можа и лингвой...  smile 
Суть то в том, что бок не только при трассировке...
см 2Zakonnic

Это сообщение отредактировал(а) setnull - 4.7.2007, 18:33
PM MAIL   Вверх
emmanuil
Дата 5.7.2007, 05:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

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



setnull, если в GetActive() какие-то сложные действия, тогда темболее откажись от свойства, используй методы. Нужно не забывать, что свойство - это доступ к полям класса и они не для сложных вычислений (конечно смотря какая сложность!).
У меня тоже был один глюк и довольно странный.
Было два обработчика события (уже не помню какие).
Если во втором обработчике нет ни строчки кода, то в первом все работает нормально, если же во втором есть код, то во втором об-ке было следующее: заходил в обработчик несколько раз : в первом заходе отрабатывал первую строчку кода а во втором последнюю.
Я был в шоке! smile 
Так и не понял в чем дело.
Конечно может я что-нибудь намудрил?! Но это как намудрить то надо, чтоб такое было?!
PM MAIL   Вверх
Exception
Дата 5.7.2007, 16:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Я надеюсь, этот "делегат" выполняется в главном потоке приложения?

Добавлено через 3 минуты и 22 секунды
emmanuil, это никак не может быть проблемой фреймворка smile . Бред ведь.
PM   Вверх
setnull
Дата 5.7.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 3.7.2007

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



Цитата(Exception @ 5.7.2007,  16:49)
Я надеюсь, этот "делегат" выполняется в главном потоке приложения?

2Exception

Блин, так и есть...

бастрый вопрос: как VS заставить отображать отловленные исключения?

Потоки не могут поделить lbCCount
Так а че ж делать? lock(lbCCount) тоже не помогает...



Это сообщение отредактировал(а) setnull - 5.7.2007, 20:17
PM MAIL   Вверх
mr.DUDA
Дата 5.7.2007, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



setnullМодератор: Пожалуйста, один топик - один вопрос.

А лочить можно любой объект, лучше всего завести какое-нибудь статик-поле с любым типом.


--------------------
user posted image
PM MAIL WWW   Вверх
emmanuil
Дата 6.7.2007, 04:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

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



emmanuil, но как тогда объяснить? Никаких потоков небыло и ничего такого я не делал, просто сделал обработчики и все. (DevExpress компоненты, мож в них глюк?)

Добавлено через 3 минуты и 26 секунд
Вот взял по запарке и себя вписал  smile 
Обращение было к Exception'у 
PM MAIL   Вверх
emmanuil
Дата 6.7.2007, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 9.1.2007

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



RepositoryItemComboBox.
По несколько раз заходит в обработчик события изменения индекса
PM MAIL   Вверх
mr.DUDA
Дата 6.7.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



emmanuil, как это относится к первому вопросу? Про девэкспресс можно в отдельной ветке спросить.


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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