C# 在将列表设置为新集合之前清除列表可能会产生哪些副作用?
我继承了一些代码。我看到这个代码存在:C# 在将列表设置为新集合之前清除列表可能会产生哪些副作用?,c#,list,C#,List,我继承了一些代码。我看到这个代码存在: private List<int> Data { get; set; } private CsClipboard() { Data = new List<int>(); } public List<int> ComponentIDs { get { return Data; } set { Data.Clear(); Da
private List<int> Data { get; set; }
private CsClipboard()
{
Data = new List<int>();
}
public List<int> ComponentIDs
{
get
{
return Data;
}
set
{
Data.Clear();
Data = value;
}
}
私有列表数据{get;set;}
私人董事会()
{
数据=新列表();
}
公共列表组件
{
收到
{
返回数据;
}
设置
{
Data.Clear();
数据=价值;
}
}
我看不出有任何理由在将数据设置为值之前调用clear。我想知道在C#中是否存在这样的场景:我想在设置值之前调用clear,而不是触发OnClear事件。这是一个相当大的技术债务代码库,所以过于谨慎
我想在将值从
类似于触发OnClear事件
List类没有事件
那么,为列表编写自己的自定义清除方法如何
我的意思是list类的扩展方法,它将使用Clear方法和自定义逻辑,代码可能会有一些不好的副作用 发生的事情是原始列表被清除。因此,代码中保存原始列表的每个其他位置现在都将保存一个空列表
每个新的get请求都将保存新列表。但是数据在整个程序中不是并发的。一般来说,应该避免返回可变列表的公共属性。一旦消费者获得了对它的引用,您就不再保证应该是内部细节的状态。清除setter中的列表只会加剧问题,因为现在您正在清除消费者可能仍然有引用的列表(即使它不再是正确的列表)
您应该考虑更改属性,以便返回列表当前状态的一个副本(最好是只读)。
AsReadOnly()。如果你不能做到这一点,至少在设置新值之前不要清除列表。我看不出这与这个问题有什么关系。@TimSchmelter OP在帖子中有这样一行:“我想在设置值之前调用clear,而不是触发OnClear事件。”所以我在回答这个问题。哦,我完全同意这很可怕。现在就试着管理它,而不破坏任何我不知道存在的东西,所以我无法测试。:)