1

私のVS2008SP1、.NET 3.5 SP1プロジェクトには、さまざまなプロパティを含むさまざまなクラスがあります。私はC#3.0の自動プロパティをよく使用します。

これらのプロパティの一部はコレクションである必要があります。シンプルにしたいのでReadOnlyCollection<T>、これらのプロパティに使用します。

IEnumerable<T>要素にランダムにアクセスしたいので、使用したくありません。

コード分​​析(FxCopルール)を使用すると、CA2227警告が表示されます。

ReadOnlyCollection<T>変更できないのにsetメソッドが必要な理由がわかりません...setメソッドは、プロパティが実行できることを正確に実行することしかできません。

例:

using System.Collections.ObjectModel;

namespace CA2227
{
    public class MyClass
    {
        public ReadOnlyCollection<int> SomeNumbers { get; set; }
    }
}

CA2227:Microsoft.Usage:プロパティセッターを削除して、「MyClass.SomeNumbers」を読み取り専用に変更します。C:\ Users ... \ Visual Studio 2008 \ Projects \ CA2227 \ MyClass.cs 7 CA2227

4

3 に答える 3

2

Aを変更することはできませんが、タイプのセッターを持つプロパティを変更して別のを参照するように変更できないReadOnlyCollection理由はありません。プロパティを不変にする場合は、読み取り専用タイプであり、非公開セッターも必要です。ReadOnlyCollectionReadOnlyCollectionSomeNumbers

編集

あなたが望むものに確信を持っているなら、FxCopはあなたに警告するのは正しいですが、あなたは警告に満足しています。それを取り除きたい場合は、SuppressMessageその時点で属性を含めます-ビルドする前にプロジェクトプロパティでCODE_ANALYSIS定数も定義している限り、FxCopはその属性を尊重し、その特定の機会にその特定の警告を発行しません。

于 2010-04-30T08:15:56.107 に答える
1

コレクション自体への変更もブロックせずに、コレクションのコンテンツへの変更をブロックするのはかなり奇妙です。自動プロパティの使用を維持しながら、クラス内からコレクションを設定できるようにする場合は、プライベートセッターを使用できます。例えば:

public ReadOnlyCollection<int> SomeNumbers { get; private set; }
于 2010-04-30T12:33:33.453 に答える
0

使用を検討してください

public class MyClass
{
    public IReadOnlyList<int> SomeNumbers { get; set; }
}

ReadOnlyCollection = http://msdn.microsoft.com/en-us/library/ms132474(v=vs.110).aspx

IReadOnlyList = http://msdn.microsoft.com/en-us/library/hh192385(v=vs.110).aspx

ReadOnlyCollectionの問題は、ICollectionから継承し、.Addが残っていることです。ただし、ドキュメントには、スローされると記載されています-http://msdn.microsoft.com/en-us/library/cc672239(v= vs.110 ).aspx

于 2013-11-16T01:57:17.777 に答える