我目前正在处理一些线程敏感代码。
在我的代码中,我有一个由两个不同线程操作的对象列表。一个线程可以将对象添加到该列表中,而另一个线程可以将其设置为空。
在上面的参考资料中,它特别提到了代表:
myDelegate?.Invoke()
相当于:
var handler = myDelegate;
if (handler != null)
{
handler(…);
}
我的问题是,这种行为与说 a是否相同List<>
?例如:
是:
var myList = new List<object>();
myList?.Add(new object());
保证相当于:
var myList = new List<object>();
var tempList = myList;
if (tempList != null)
{
tempList.Add(new object());
}
?
编辑:
请注意,(委托的工作方式)之间存在差异:
var myList = new List<int>();
var tempList = myList;
if (tempList != null)
{
myList = null; // another thread sets myList to null here
tempList.Add(1); // doesn't crash
}
和
var myList = new List<int>();
if (myList != null)
{
myList = null; // another thread sets myList to null here
myList.Add(1); // crashes
}