C# 无法将项添加到集合属性。请用hе;lр;请告诉我

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

我正在尝试将项目添加到SynchronizedCollection中,但只有将其直接添加到字段中,它才能工作

        _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,而只是字段。啊,我明白你的意思了。做了一个小小的修改,这样我就可以删除否决票了~!