Проблема геттера / сеттера в C # - PullRequest
2 голосов
/ 02 апреля 2009

я делаю

static bool isWorking
    {
        get { return _isWorking; }
        set {
            myform.treeView1.Enabled = !value;
            _isWorking = value;
        }
    }

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

set { myform.treeView1.Enabled = !(_isWorking = value); }

Я вижу, что isWorking установлен, а myform.treeView1.Enabled - нет. Что происходит?

Ответы [ 2 ]

9 голосов
/ 02 апреля 2009

Что вы подразумеваете под "отладчик показывает, что он останавливается"? Возможно ли, что myform равно нулю, или myform.treeView1 равно нулю?

Я не могу вспомнить точный порядок оценки в этом случае, но он мог бы объяснить симптомы, которые вы описываете. Зная, почему отладчик «останавливается», очень важно. Другая возможность состоит в том, что вы пытаетесь получить доступ к пользовательскому интерфейсу из потока, не являющегося пользовательским интерфейсом, что помешает правильной работе назначения для Enabled.

О, и, пожалуйста, не используйте свою вторую версию - назначение в качестве побочного эффекта очень, очень редко хорошая идея. Единственное идиоматическое использование, которое я знаю, - это циклы с IO:

string line;
while ( (line = reader.ReadLine()) != null)

и я считаю это приемлемым только потому, что оно достаточно распространено. В этом случае это выглядит так, что вы могли бы означать "==" вместо "=".

0 голосов
/ 02 апреля 2009

Потому что (_isWorking = value) всегда возвращает true. Если бы вы написали:

myform.treeView1.Enabled = !(_isWorking == value);

Это работает так: если isWorking равно значению, то отключить treeView. Но в твоем случае - нет

...