0

私はいくつかのコードを継承しました。このコードが存在することがわかります。

private List<int> Data { get; set; }

private CsClipboard()
{
    Data = new List<int>();
}

public List<int> ComponentIDs
{
    get
    {
        return Data;
    }
    set
    {
        Data.Clear();
        Data = value;
    }
}

Dataをvalueに設定する前にclearを呼び出す理由がわかりません。OnClearイベントのトリガーなど以外に値を設定する前に、clearを呼び出したいシナリオがC#にあるかどうか疑問に思っています。これは、技術を備えたかなり大きなコードベースです。借金なので、過度に用心しているだけです。

4

3 に答える 3

4

そのコードは、いくつかの厄介な副作用をもたらす可能性があります。

そこで何が起こるかというと、元のリストがクリアされます。したがって、元のリストを保持するコード内の他のすべての場所は、空のリストを保持するようになります。

すべての新しいgetリクエストは、新しいリストを保持します。ただし、データはプログラム全体で並行しているわけではありません。

于 2012-07-13T23:36:39.857 に答える
3

一般に、可変リストを返すパブリックプロパティは避ける必要があります。消費者がそれへの参照を取得すると、内部の詳細がどうあるべきかについての状態についての保証はなくなります。セッターでリストをクリアすると、問題が悪化するだけです。これは、コンシューマーがまだ参照している可能性のあるリストをクリアしているためです(正しいリストではなくなったとしても)。

リストの現在の状態のコピー(できれば読み取り専用)を返すように、プロパティを変更することを検討する必要があります。このAsReadOnly()方法はここで役立ちます。それができない場合は、少なくとも新しい値を設定する前にリストをクリアしないでください。

于 2012-07-13T23:38:36.210 に答える
1

OnClearイベントをトリガーするようなもの以外の値を設定する前に、clearを呼び出したいと思います。

ListクラスにはイベントMSDNがありません

では、リストに独自のカスタムClearメソッドを作成してみてはどうでしょうか。

カスタムロジックでClearメソッドを使用するリストクラスの拡張メソッドを意味します

于 2012-07-13T23:35:34.590 に答える