FxCop CA2227 Warnung und Readonlycollection
-
02-10-2019 - |
Frage
In meinem VS2008 SP1, .NET 3.5 SP1-Projekt habe ich verschiedene Klassen, die unterschiedliche Eigenschaften aufweisen. Ich verwende C # 3.0 Auto Eigenschaften viel.
Einige dieser Eigenschaften müssen Sammlungen sein. Da ich es einfach machen will, verwende ich ReadOnlyCollection<T>
für diese Eigenschaften.
Ich will nicht IEnumerable<T>
verwenden, da ich zu den Elementen Random Access will.
Ich benutze Codeanalyse (FxCop Regeln) und ich erhalte die CA2227 Warnung.
Ich verstehe nicht, warum ReadOnlyCollection<T>
eine Set-Methode haben sollte, während es nicht geändert werden kann ... Die Set-Methode kann genau nur das tun, was die Eigenschaft tun kann.
Beispiel:
using System.Collections.ObjectModel;
namespace CA2227
{
public class MyClass
{
public ReadOnlyCollection<int> SomeNumbers { get; set; }
}
}
CA2227: Microsoft.Usage: Change 'MyClass.SomeNumbers' durch Entfernen der Eigenschaft Setter schreibgeschützt werden. C: \ Users ... \ Visual Studio 2008 \ Projects \ CA2227 \ MyClass.cs 7 CA2227
Lösung
Ein ReadOnlyCollection
kann nicht geändert werden, aber es gibt keinen Grund, warum eine Eigenschaft mit einem Setter, die vom Typ ReadOnlyCollection
ist, kann nicht geändert werden, um einen anderen ReadOnlyCollection
zu verweisen. Wenn Sie die SomeNumbers
Eigenschaft sein unveränderlich wollen, dann braucht es sowohl einen Nur-Lese-Typen zu sein, und auch einen nicht-öffentlichen Setter hat.
Bearbeiten
Wenn Sie überzeugt sind, was Sie wollen, dann obwohl FxCop korrekt ist, Sie zu warnen, sind Sie mit der Warnung glücklich. Wenn Sie es loswerden wollen, sind dann ein SuppressMessage
Attribut an diesem Punkt - solange Sie auch eine CODE_ANALYSIS Konstante in den Projekteigenschaften definieren, bevor Sie bauen, werden FxCop das Attribut ehren und geben einfach nicht, dass bestimmte Warnung an diesem Anlass.
Andere Tipps
Es ist ziemlich seltsam Änderungen an den Inhalt der Sammlung zu blockieren, ohne auch Änderungen an der Sammlung Sperrung selbst. Wenn Sie die Sammlung setzen aus Ihrer Klasse in der Lage sein wollen, während die Verwendung von automatischen Eigenschaften Erhaltung, könnten Sie einen privaten Setter verwenden. z.
public ReadOnlyCollection<int> SomeNumbers { get; private set; }
Betrachten Sie mit
public class MyClass
{
public IReadOnlyList<int> SomeNumbers { get; set; }
}
http://msdn.microsoft .com / de-de / library / ms132474 (v = vs.110) aspx
IReadOnlyList = http://msdn.microsoft .com / de-de / library / hh192385 (v = vs.110) aspx
Das Problem mit Readonlycollection ist, dass es immer noch erbt von ICollection, und noch hat .Add, obwohl Dokumentation sagen, es wird werfen - http://msdn.microsoft.com/en-us/library/cc672239 (v = vs.110) aspx