Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Общие вопросы по .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 - ничё не происходит ![]() При трассировке, на свойство 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" ![]() Мало того - это все в рамках Visual Studio. Если выполнять непосредственно exe-шник - все работает... I ![]() |
Автор: 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. |
Автор: 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 | ||
Ну по порядочку... 2emmanuil (почти теска) private bool _active = false; На данный момент это просто эМУЛЯЖ... На самом деле логика GetActive() намного сложнее... Просто, когда я изначально столкнулся с таким беспределом, подумал, может это из-за lockов и потоков там ких-нить... Для проверки - вот, все равно... |
Автор: setnull 4.7.2007, 18:12 | ||||||
2Zakonnic Ну ничего себе... Если на это закрыть глаза ( ну да, пускай, это же .NET Framework, он ведь еще так молод...), то кААк я могу быть уверен, что он мне завтра в релизе не скжет: "Ой, [%username], прости, мол, по вторникам у меня 5 % 3 == 7..." Хотя, постой... Что ты подрозумеваешь под "дебагер"? С помощью трассировки, я только хотел уточнить, че там происходит... Но и при обыкновенном выполнении кода (без трассировки, без breakpointов, просто F5)
при значениях Active == true (это только закономерность...) отрабатывает только код строки 0х00 по поводу get { return _active; } см 2emmanuil |
Автор: setnull 4.7.2007, 18:30 | ||
2Exception Так смысл сообщения не обязятельно гуглить, можа и лингвой... ![]() Суть то в том, что бок не только при трассировке... см 2Zakonnic |
Автор: emmanuil 5.7.2007, 05:12 |
setnull, если в GetActive() какие-то сложные действия, тогда темболее откажись от свойства, используй методы. Нужно не забывать, что свойство - это доступ к полям класса и они не для сложных вычислений (конечно смотря какая сложность!). У меня тоже был один глюк и довольно странный. Было два обработчика события (уже не помню какие). Если во втором обработчике нет ни строчки кода, то в первом все работает нормально, если же во втором есть код, то во втором об-ке было следующее: заходил в обработчик несколько раз : в первом заходе отрабатывал первую строчку кода а во втором последнюю. Я был в шоке! ![]() Так и не понял в чем дело. Конечно может я что-нибудь намудрил?! Но это как намудрить то надо, чтоб такое было?! |
Автор: Exception 5.7.2007, 16:49 |
Я надеюсь, этот "делегат" выполняется в главном потоке приложения? Добавлено через 3 минуты и 22 секунды emmanuil, это никак не может быть проблемой фреймворка ![]() |
Автор: setnull 5.7.2007, 19:54 | ||
2Exception Блин, так и есть... бастрый вопрос: как VS заставить отображать отловленные исключения? Потоки не могут поделить lbCCount Так а че ж делать? lock(lbCCount) тоже не помогает... |
Автор: mr.DUDA 5.7.2007, 21:17 |
setnull, Модератор: Пожалуйста, один топик - один вопрос. А лочить можно любой объект, лучше всего завести какое-нибудь статик-поле с любым типом. |
Автор: emmanuil 6.7.2007, 04:47 |
emmanuil, но как тогда объяснить? Никаких потоков небыло и ничего такого я не делал, просто сделал обработчики и все. (DevExpress компоненты, мож в них глюк?) Добавлено через 3 минуты и 26 секунд Вот взял по запарке и себя вписал ![]() Обращение было к Exception'у |
Автор: emmanuil 6.7.2007, 05:16 |
RepositoryItemComboBox. По несколько раз заходит в обработчик события изменения индекса |
Автор: mr.DUDA 6.7.2007, 09:33 |
emmanuil, как это относится к первому вопросу? Про девэкспресс можно в отдельной ветке спросить. |