.NET团队决定在Interlocked.Exchange操作中不支持布尔值,是否有一些实际的原因?
使用示例之一是当您想保证某些代码仅执行一次并且您想要为此使用布尔标志时。
.NET团队决定在Interlocked.Exchange操作中不支持布尔值,是否有一些实际的原因?
使用示例之一是当您想保证某些代码仅执行一次并且您想要为此使用布尔标志时。
Answers:
InterlockedExchange
对于小于32位的任何类型都不存在,并且缺少bool
重载只是这种情况的结果。
不回答问题,但是作为一种解决方法,您可以像C一样使用int代替bool。
int m_IsFirstTime = 1; // 1 means true 0 means false.
void SomeMethod()
{
if (1 == Interlocked.Exchange(ref m_IsFirstTime , 0))
// Do something for the first time.
else
// Do something for all other times.
}
PS:如果有证据表明读取比写入快,那么Interlocked.CompareExchange在这种情况下可能会更好(只有一次是第一次,我认为很多非第一次)。
int
andif(Interlocked.CompareExchange(ref value, 1, 0)==0) {...}
,而不能回答为什么当然...或者也许更容易--Lazy<T>
:msdn.microsoft.com/en-us/library/dd642331.aspx