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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top