Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Свойства компонента - это же просто?


Автор: setnull 3.7.2007, 12:31
Люд, представьте себе следующую ситуацию:

Компонент

{
...
        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

Автор: 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.

Автор: 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; }
        }

Автор: Exception 4.7.2007, 14:05
http://google.com/search?q=%22function%20evaluation%20disabled%20because%20a%20previous%20function%20evaluation%20timed%20out%22 было очень трудно?
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=600009&SiteID=1 вам и ответ на поставленный вопрос.
По сути, достаточно лишь представить себе как работает отладчик. Вот вы навели курсор на свойство объекта и хотите посмотреть его значение.. Как студии его вычислить, чтобы потом отобразить? В большинстве случаев всё банально: если getter просто возвращает какое-то поле класса, студия об этом "догадывается" и отображает это поле, минуя выполнение getter-а.
Если же getter возвращает что-то хоть чуточку более сложное, метод-аксессор всё-таки придётся выполнить. Но как? Ведь getter находится в вашем коде, а сейчас отладчик стоит на конкретной строчке этого кода и не может вдруг броситься выполнять какой-то метод, чтобы узнать значение свойства. Выполнить метод в другом потоке по понятным причинам нельзя. Вот вам и ошибка.

Автор: setnull 4.7.2007, 17:51
Цитата(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ов и потоков там ких-нить... Для проверки - вот, все равно... 

Автор: setnull 4.7.2007, 18:12
Цитата(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:30
Цитата(Exception @ 4.7.2007,  14:05)
http://google.com/search?q=%22function%20evaluation%20disabled%20because%20a%20previous%20function%20evaluation%20timed%20out%22 было очень трудно?
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=600009&SiteID=1 вам и ответ на поставленный вопрос.
По сути, достаточно лишь представить себе как работает отладчик. Вот вы навели курсор на свойство объекта и хотите посмотреть его значение.. Как студии его вычислить, чтобы потом отобразить? В большинстве случаев всё банально: если getter просто возвращает какое-то поле класса, студия об этом "догадывается" и отображает это поле, минуя выполнение getter-а.
Если же getter возвращает что-то хоть чуточку более сложное, метод-аксессор всё-таки придётся выполнить. Но как? Ведь getter находится в вашем коде, а сейчас отладчик стоит на конкретной строчке этого кода и не может вдруг броситься выполнять какой-то метод, чтобы узнать значение свойства. Выполнить метод в другом потоке по понятным причинам нельзя. Вот вам и ошибка.


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

Автор: emmanuil 5.7.2007, 05:12
setnull, если в GetActive() какие-то сложные действия, тогда темболее откажись от свойства, используй методы. Нужно не забывать, что свойство - это доступ к полям класса и они не для сложных вычислений (конечно смотря какая сложность!).
У меня тоже был один глюк и довольно странный.
Было два обработчика события (уже не помню какие).
Если во втором обработчике нет ни строчки кода, то в первом все работает нормально, если же во втором есть код, то во втором об-ке было следующее: заходил в обработчик несколько раз : в первом заходе отрабатывал первую строчку кода а во втором последнюю.
Я был в шоке! smile 
Так и не понял в чем дело.
Конечно может я что-нибудь намудрил?! Но это как намудрить то надо, чтоб такое было?!

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

Добавлено через 3 минуты и 22 секунды
emmanuil, это никак не может быть проблемой фреймворка smile . Бред ведь.

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

2Exception

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

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

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


Автор: mr.DUDA 5.7.2007, 21:17
setnullМодератор: Пожалуйста, один топик - один вопрос.

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

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

Добавлено через 3 минуты и 26 секунд
Вот взял по запарке и себя вписал  smile 
Обращение было к Exception'у 

Автор: emmanuil 6.7.2007, 05:16
RepositoryItemComboBox.
По несколько раз заходит в обработчик события изменения индекса

Автор: mr.DUDA 6.7.2007, 09:33
emmanuil, как это относится к первому вопросу? Про девэкспресс можно в отдельной ветке спросить.

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