猿问

关于Segment<T>的实现

最近在研究ConcurrentQueue的实现,发现里面有个私有类Segment,拿Reflector看了下,其中有如下的代码: 1 internal List ToList(int start, int end) 2 { 3 List list = new List(); 4 for (int i = start; i <= end; i++) 5 { 6 SpinWait wait = new SpinWait(); 7 while (this.m_state[i] == null) 8 { 9 wait.SpinOnce(); 10 } 11 list.Add(this.m_array[i]); 12 } 13 return list; 14 } this.m_state[i] == null,这句中的m_state[i]是一个整形数组,为什么会有这种奇怪的判断方式?this.m_state[i]的值不是一个整数么,什么时候会有null的情况出现?   另外有如下代码片段: 1 try 2 { 3 } 4 finally 5 { 6 index = Interlocked.Increment(ref this.m_high); 7 if (index <= 0x1f) 8 { 9 this.m_array[index] = value; 10 this.m_state[index] = 1; 11 } 12 if (index == 0x1f) 13 { 14 this.Grow(ref tail); 15 } 16 } 为什么将try留空,而将实现放在finally里面,这种写法有什么特别的作用么?感觉颠覆了我写代码的常识了,求高人解惑
陪伴而非守候
浏览 501回答 9
9回答

弑天下

第一个是反编译问题,正如上面的人所说。第二个问题详解看这里。简单来说就是因为这里是多线程环境,因此任何时候都有可能会引发ThreadAbortException,如果是在try块里那么某些代码不能保证被执行。而finally块则可以保证即使是发生了ThreadAbortException,这些代码也会被执行。这是一个小技巧,不过现在已经不适用了,更好的替代方式是Thread.BeginCritialRegeion。

慕容708150

int在用户在建立字段的时候如果int?这个样子的话,那么int默认就是null。 至于为什么写在finally里面,我感觉没有什么意义。

慕娘9325324

你的反编译有问题吧: // System.Collections.Concurrent.ConcurrentQueue.Segment internal List ToList(int start, int end) { List list = new List(); for (int i = start; i

不负相思意

try里面没有任何代码的话,有什么可能性会触发Exception,反而是在finally里面放了那么多代码,要是引发Exception的话程序不就崩掉了?

临摹微笑

@garry: MSDN对 finally 还有个解释,这里的直接原因不是多线程的问题,而是发生了 Unhandled Exception (这可能是 OS 异常)后,如何处理 finally 中代码块的问题,根据 OS 的设置,finally 中代码可能不会被执行。在 OS 看来,出现错误后会设置一个中断,CLR 根据中断的类型和位置做对应的处理,又或者无法处理直接卸载整个进程。

尚方宝剑之说

@Launcher: 非常感谢你的解释,总段弄明白了

慕田峪4524236

我也觉得是反编译问题,用dotpeek比较好
随时随地看视频慕课网APP
我要回答