在将列表设置为新集合之前清除列表可能会产生哪些副作用?

时间:2012-07-13 23:31:09

标签: c# list

我继承了一些代码。我看到这段代码存在:

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

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

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

在将数据设置为值之前,我没有看到任何理由要求清除。我想知道在C#中是否存在我希望在设置值之前调用clear以避免触发OnClear事件之类的情况。这是一个相当大的代码库与技术。债务,所以只是过于谨慎。

3 个答案:

答案 0 :(得分:4)

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

原始列表被清除后会发生什么。所以包含原始列表的代码中的每个其他位置现在都将保留一个空列表。

每个新的获取请求都将保留新列表。但整个计划中的数据并不存在。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

  

我希望在设置值之前调用clear   比如触发OnClear事件。

List类没有事件MSDN

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

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

一起使用