C# 无法将项添加到集合属性。请用hе;lр;请告诉我
我正在尝试将项目添加到SynchronizedCollection中,但只有将其直接添加到字段中,它才能工作C# 无法将项添加到集合属性。请用hе;lр;请告诉我,c#,list,asynchronous,concurrency,synchronization,C#,List,Asynchronous,Concurrency,Synchronization,我正在尝试将项目添加到SynchronizedCollection中,但只有将其直接添加到字段中,它才能工作 _s = new SynchronizedCollection<int>(); _s.Add(01010); S.Add(123); private SynchronizedCollection<int> _s; public SynchronizedCollection<int> S
_s = new SynchronizedCollection<int>();
_s.Add(01010);
S.Add(123);
private SynchronizedCollection<int> _s;
public SynchronizedCollection<int> S
{
get
{
lock (_s.SyncRoot)
{
return new SynchronizedCollection<int>(_s.SyncRoot, _s);
}
}
private set
{
_s= value;
}
}
\u s=newsynchronizedCollection();
_s、 添加(01010);
S.Add(123);
私有同步收集;
公共同步集合
{
得到
{
锁定(同步根)
{
返回新的SynchronizedCollection(\u.SyncRoot,\u s);
}
}
专用设备
{
_s=值;
}
}
如何让它工作
只有将其直接添加到字段中,它才有效
因为您没有将新创建的SynchronizedCollection
分配给\u
。每次调用S
getter时,都会创建新集合,并添加所有元素<代码>\u s实际上保持不变
lock (_s.SyncRoot)
{
_s = new SynchronizedCollection<int>(_s.SyncRoot, _s);
return _s;
}
lock(\u.SyncRoot)
{
_s=新的SynchronizedCollection(\u.SyncRoot,\u s);
返回;;
}
虽然我不认为每次都需要创建新集合,SynchronizedCollection
本身是线程安全的,所以您可以直接返回\u
,但不知道实际场景中为什么要这样做
只有将其直接添加到字段中,它才有效
因为您没有将新创建的SynchronizedCollection
分配给\u
。每次调用S
getter时,都会创建新集合,并添加所有元素<代码>\u s实际上保持不变
lock (_s.SyncRoot)
{
_s = new SynchronizedCollection<int>(_s.SyncRoot, _s);
return _s;
}
lock(\u.SyncRoot)
{
_s=新的SynchronizedCollection(\u.SyncRoot,\u s);
返回;;
}
虽然我不认为每次都需要创建新的集合,
SynchronizedCollection
本身是线程安全的,因此您可以直接返回\u s
,但不知道实际情况下为什么要这样做。一个选项是公开一个公共AddItem
方法,该方法接受int
并将其添加到您的私有字段:
public void AddItem(int item)
{
_s.Add(item);
}
显然,您也可以在
get
方法中返回私有字段\u s
,而不是它的副本,然后客户端可以通过该引用直接在私有字段上调用Add
,但这样做没有什么意义 一个选项是公开一个公共AddItem
方法,该方法接受int
并将其添加到您的私有字段中:
public void AddItem(int item)
{
_s.Add(item);
}
显然,您也可以在
get
方法中返回私有字段\u s
,而不是它的副本,然后客户端可以通过该引用直接在私有字段上调用Add
,但这样做没有什么意义 您的get
每次返回集合的新实例时,您应该返回\u s
。。。所以,你将元素添加到新集合中,然后你实际上扔掉了……):你的<代码> SET/CODE >是私有的,所以你还没有提供对类之外添加一个项的访问。你可以考虑使用其中一个集合代替,可能是类。你能展示一个你试图添加一个项目的例子吗?您如何验证它没有被添加?您的get
每次返回集合的新实例时,您都应该返回\s
。。。所以,你将元素添加到新集合中,然后你实际上扔掉了……):你的<代码> SET/CODE >是私有的,所以你还没有提供对类之外添加一个项的访问。你可以考虑使用其中一个集合代替,可能是类。你能展示一个你试图添加一个项目的例子吗?你是如何验证它没有被添加的?它实际上回答了。问题是为什么项目没有被添加到集合中使用getter,而只是字段。啊,我明白你的意思了。做了一个小小的修改,这样我就可以删除否决票了~!事实上,这就是答案。问题是为什么项目没有被添加到集合中使用getter,而只是字段。啊,我明白你的意思了。做了一个小小的修改,这样我就可以删除否决票了~!