我一直在阅读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
答案 0 :(得分:3)
ThreadLocal.cs
的{{3}}包含针对此字段的以下注释:
此ThreadLocal的插槽ID&lt;&gt;实例。我们存储ID的按位补码(即~ID),这允许我们区分ID为0的情况和未完全初始化的对象,这可能是由于构造函数中的线程中止,或者可能是由于内存模型用户代码中的问题。
它们实际上是将ID的默认未初始化值从0切换到-1,如果直接存储为int
字段,则为-1。