这可能是一个愚蠢的问题,但我是否需要使用和分配锁,或者我可以简单地返回结果。
例如:
我有一个私有帮助器方法,它返回一个IEnumerable文件名列表。它使用一个锁来确保方法在迭代m_transfers集合时是线程安全的。
我需要作业......
IEnumerable<String> updated;
lock (m_transfers.Lock)
{
updated = m_transfers.Values.Where(transfer => transfer.Updated)
.Select(transfer => transfer.Filename);
}
return updated;
或者我可以做什么
lock (m_transfers.Lock)
{
return updated = m_transfers.Values.Where(transfer => transfer.Updated)
.Select(transfer => transfer.Filename);
}
答案 0 :(得分:3)
不,您不需要添加额外的变量;语义在任何一种方式都是相同的,因为在任何一种情况下,只要我们放弃锁定,我们只有实际返回值。
由于变量不起作用,我会将其删除并使用第二个版本 - 虽然技术上,编译器实际上会将其重新放回(lock
涉及到try
/ finally
,在IL级别,ret
内不能try
;因此编译器实际上就像你的{{1}}一样第一版)。
答案 1 :(得分:1)
在try
,using
的情况下,您不必这样做,您不必在此处执行此操作。编译器在函数退出时为您提供所需的代码。
点击此处了解详情:Monitor vs lock
答案 2 :(得分:0)
两者都有效。
一旦你返回执行就出现了。