2010-03-29 3 views
3

Je viens de commencer à travailler avec FxCop pour voir à quel point mon code ne fonctionne pas avec son ensemble de règles. Je commence avec les règles "Breaking", et le premier que j'ai rencontré est CA2227, qui dit essentiellement que vous devez faire en sorte que le setter de la propriété d'une collection ne soit pas modifié accidentellement. Depuis que j'utilise MVVM, j'ai trouvé très pratique d'utiliser un ObservableCollection avec des propriétés get/set parce que mes mises à jour de GUI sont faciles et concises dans le code-behind. Cependant, je peux aussi voir ce que FxCop se plaint. Une autre situation que je viens de rencontrer est avec WF, où j'ai besoin de définir les paramètres lors de la création du flux de travail, et je détesterais avoir à écrire une classe wrapper autour de la collection que j'utilise juste pour éviter cela message d'erreur particulier.FxCop déteste mon utilisation de MVVM

Par exemple, voici un message d'erreur d'exécution exemple que je reçois quand je fais des propriétés en lecture seule:

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

Que faites-vous des opinions à ce sujet? Je pourrais soit ignorer cette erreur particulière, mais ce n'est probablement pas bon parce que je pourrais éventuellement violer cette règle ailleurs dans le code où MVVM ne s'applique pas (code de modèle seulement, par exemple). I pense Je pourrais également le changer d'une propriété à une classe avec des méthodes pour manipuler la collection sous-jacente, et puis soulever la notification nécessaire de la méthode de setter. Je suis un peu confus ... quelqu'un peut-il nous éclairer là-dessus?

Répondre

7

Cette règle spécifique indique qu'une propriété de collection doit être rendue en lecture seule car vous n'avez pas besoin d'affecter une collection entière à une propriété.

Par exemple, imaginez une classe comme ceci:

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

Que se passerait-il si quelque part dans le code que j'ai la ligne suivante:

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 }); 

Lorsque les deux dernières lignes de code sont exécutées les gestionnaires d'événements attachés ne seront pas déclenchés, car la propriété Bar a un objet différent complet. D'autre part, si la propriété était en lecture seule, les événements seraient déclenchés et tout se passerait comme prévu.

+0

c'est bon à savoir, merci pour l'explication. Cependant, cela n'aide pas dans la situation Windows Workflow. Je vais mettre à jour ma question avec un message d'erreur d'exécution spécifique. – Dave

+1

Pourquoi ne pas simplement ignorer cet article rapporté? Vous pouvez utiliser l'attribut System.Diagnostics.CodeAnalysis.SuppressMessage pour ignorer ces fausses alarmes. –

+0

@Lex: Je le fais maintenant pour ces instances spécifiques. Sur une note légèrement liée, j'ai rencontré des problèmes avec SuppressMessage dans un cas spécifique (global). Avez-vous des suggestions pour cela? http://stackoverflow.com/questions/2542883/globally-disabling-fxcop-errors-in-teamcity – Dave

Questions connexes