2010-03-29 2 views
3

Я только начал работать с FxCop, чтобы увидеть, насколько плохо мой код работает против его полного набора правил. Я начинаю с правил «Breaking», и первым, с которым я столкнулся, был CA2227, который в основном говорит о том, что вы должны сделать установщик свойств коллекции только для чтения, чтобы вы не могли случайно изменить данные коллекции.FxCop ненавидит мое использование MVVM

Поскольку я использую MVVM, мне было очень удобно использовать ObservableCollection с параметрами get/set, потому что это упрощает и упрощает мои обновления графического интерфейса в коде. Однако я также вижу, о чем жалуется FxCop.

Другая ситуация, с которой я столкнулся, - это WF, где мне нужно установить параметры при создании рабочего процесса, и мне было бы неловко писать класс-оболочку вокруг коллекции, которую я использую, чтобы избежать этого конкретное сообщение об ошибке.

Например, вот сообщение об ошибке во время выполнения пробы, что я получаю, когда я делаю свойство только для чтения:

The activity 'MyWorkflow' has no public writable property named 'MyCollectionOfStuff' 

Что вы мнение по этому поводу? Я мог либо игнорировать эту конкретную ошибку, но это, вероятно, не очень хорошо, потому что я мог бы, по-видимому, нарушить это правило в другом месте кода, где MVVM не применяется (например, только код модели). I think Я мог бы также изменить его из свойства в класс с помощью методов управления базой данных, а затем поднять необходимое уведомление из метода setter. Я немного смущен ... может кто-нибудь пролить свет на это?

ответ

7

В этом конкретном правиле указано, что свойство collection должно быть доступно только для чтения, потому что вам не нужно назначать целую коллекцию для свойства.

Например, представьте себе класс, как это:

public class Foo 
{ 
    public ObservableCollection<int> Bar { get; set; } 
} 

Что бы произошло, если бы где-то в коде у меня есть следующие строки:

var f = new Foo(); 
f.Bar = new ObservableCollection<int>(); 
f.Bar.AddRange(new int[] { 1, 2, 3, 4 }); 
// ... 
// Attaches and handlers to the collection events 
// ... 
f.Bar = new ObservableCollection<int>(); 
f.Bar.AddRange(new int[] { 5, 6, 7, 8 }); 

Когда последние две строки кода выполняются связанные обработчики событий не будут запущены, потому что свойство Bar имеет совершенно другой объект.

С другой стороны, если объект был доступен только для чтения, события будут запущены, и все будет вести себя так, как ожидалось.

+0

это приятно знать, спасибо за объяснение. Однако это не помогает в ситуации Windows Workflow. Я собираюсь обновить свой вопрос с определенным сообщением об ошибке выполнения. – Dave

+1

Почему бы просто не проигнорировать этот элемент? Вы можете использовать атрибут System.Diagnostics.CodeAnalysis.SuppressMessage, чтобы игнорировать такие ложные тревоги. –

+0

@ Lex: Я делаю это сейчас для этих конкретных случаев. В незначительной заметке у меня возникли проблемы с SuppressMessage в конкретном (глобальном) случае. Есть ли у вас какие-либо предложения по этому поводу? http://stackoverflow.com/questions/2542883/globally-disabling-fxcop-errors-in-teamcity – Dave