C#中的双位NOT(~~)

时间:2014-06-26 10:50:57

标签: c# bit-manipulation

我一直在阅读ThreadLocal<T>实现,并且在将其存储到私有int字段(m_idComplement)然后反转之前,并不完全理解反转int id的理由几乎在它使用的每个表达式中都会再次出现。除了适用于JavaScript的this case之外,我无法找到有关为什么双重否定在C#中有用的任何信息?

在第240行,它确实分配0而没有否定,但是它可以只分配一个-1并且只丢弃所有其他不必要的那些,不是吗?

https://dl.dropboxusercontent.com/u/65419748/ThreadLocal.cs

https://i.imgur.com/3z3F64V.png

enter image description here

1 个答案:

答案 0 :(得分:3)

ThreadLocal.cs的{​​{3}}包含针对此字段的以下注释:

  

此ThreadLocal的插槽ID&lt;&gt;实例。我们存储ID的按位补码(即~ID),这允许我们区分ID为0的情况和未完全初始化的对象,这可能是由于构造函数中的线程中止,或者可能是由于内存模型用户代码中的问题。

它们实际上是将ID的默认未初始化值从0切换到-1,如果直接存储为int字段,则为-1。