1

コード分​​析 (VS 2012) が次のコードに対して「CA1819: プロパティは配列を返さないでください」と出力する理由を知りたいです。

private byte[] BackingFieldData;

public byte[] Data
{
    get { return this.BackingFieldData; }
    set { this.BackingFieldData = value; }
}

警告の説明には、プロパティが読み取り専用であっても、プロパティによって返される配列は書き込み保護されていません。配列の改ざんを防ぐために、プロパティは配列のコピーを返す必要があります。

私が欲しいのは、配列を返すことです。ユーザーは配列を変更できる必要がありますが、サイズを変更することはできません。配列のサイズは、ユーザーによって頻繁にアクセスされます。ユーザーは、インデックスによって要素にアクセスできる必要があります。したがって、配列型は完全に適合するようです。

私が検討した代替案は、 (インデックス作成はandなどIEnumerable<byte>を使用してひどく行われます)、 (要素の追加と削除に焦点を当てています-私はそれを望んでいません)、および(クラスが常にsをスローするメソッドを公開するとき、私はそれを嫌います。良いコーディングスタイルの私見)。また、配列の周りにラッパー クラスを使用してカスタム インターフェイスを作成することも考えましたが、そのポイントは何ですか (警告を抑制せずに取り除くことができたことを除いて)。SkipTakeIList<byte>ReadOnlyCollection<byte>NotSupportedException

それで、配列型の代わりに返すのに適した型、またはこの場合に配列を返さない正当な理由について誰かが知っていますか? これまでに言及しなかった影響はありますか?

4

2 に答える 2

5

この場合、その警告を抑制する必要があります。
ほとんどのアレイガイドラインはに適用されませんbyte[]

privateただし、セッターも削除(またはサイズ変更)する必要があります。

于 2012-10-23T14:15:37.757 に答える
0

.NET Framework 4.5 はIReadOnlyList<T> インターフェイスを提供します

配列は、IReadOnlyList<T>変換なしなどに割り当てることができます - 私見が最良の解決策です。

于 2013-04-17T10:15:21.460 に答える