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 。我想知道 C# 中是否存在我想在设置值之前调用 clear 的场景,而不是触发 OnClear 事件。这是一个相当大的技术代码库。债务,所以只是过于谨慎。

4

3 回答 3

4

该代码可能会产生一些令人讨厌的副作用。

发生的事情是原始列表被清除。因此,代码中保存原始列表的所有其他位置现在都将保存一个空列表。

每个新的获取请求都将保存新列表。但是数据在整个程序中不是并发的。

于 2012-07-13T23:36:39.857 回答
3

通常,您应该避免返回可变列表的公共属性。一旦消费者获得对它的引用,您就不再能够保证应该是内部细节的状态。在 setter 中清除列表只会加剧问题,因为现在您正在清除消费者可能仍然引用的列表(即使它不再是正确的列表。)

您应该考虑更改该属性,以便它返回列表当前状态的副本(最好是只读的)。该AsReadOnly()方法可以在这里提供帮助。如果你不能这样做,至少在设置新值之前不要清除列表。

于 2012-07-13T23:38:36.210 回答
1

除了触发 OnClear 事件之外,我想在设置值之前调用 clear 。

List 类没有事件MSDN

那么如何为列表编写自己的自定义 Clear 方法

我的意思是列表类的扩展方法,它将使用您的 Clear 方法和您的自定义逻辑

于 2012-07-13T23:35:34.590 回答