首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

质疑CLR Via C#中的一段代码,求指教狠批,只要能求得答案!解决方案

2012-03-21 
质疑CLR Via C#中的一段代码,求指教狠批,只要能求得答案!!这个问题困扰了大半个月了,睡觉之前老在琢磨!憋

质疑CLR Via C#中的一段代码,求指教狠批,只要能求得答案!!
这个问题困扰了大半个月了,睡觉之前老在琢磨!憋不住了来CSDN求解释!大恩不言谢!

代码是该书第三版 泛型部分P244

C# code
using System;using System.Collections.Generic;using System.Diagnostics;using System.Collections;namespace GenericsTest{    sealed class Program    {        static void Main(string[] args)        {            ValueTypePerfTest();            ReferenceTypePerfTest();            Console.ReadKey();        }        private static void ValueTypePerfTest()        {            const int count = 10000000;            using (new OperationTimer("List<Int32>"))            {                List<Int32> l = new List<int>(count);                for (Int32 n = 0; n < count; n++)                {                    l.Add(n);                    Int32 x = l[n];                }                l = null;            }            using (new OperationTimer("ArrayList of Int32"))            {                ArrayList a = new ArrayList();                for (Int32 n = 0; n < count; n++)                {                    a.Add(n);                    Int32 x = (Int32)a[n];                }                a = null;            }        }        private static void ReferenceTypePerfTest()        {            const int count = 10000000;            using (new OperationTimer("List<String>"))            {                List<string> l = new List<string>();                for (Int32 i = 0; i < count; i++)                {                    l.Add("X");                    String x = (String)l[i];                }                l = null;            }            using (new OperationTimer("ArrayList Of  String"))            {                ArrayList a = new ArrayList();                for (Int32 i = 0; i < count; i++)                {                    a.Add("X");                    String x = (String)a[i];                }                a = null;            }        }    }    internal sealed class OperationTimer : IDisposable    {        public void Dispose()        {            Console.WriteLine("{0:###0.00000000} 秒, (GCS={1}) {2}", (Stopwatch.GetTimestamp() - m_startTime) / (double)Stopwatch.Frequency, GC.CollectionCount(0) - m_collectionCount, m_text);        }        private Int64 m_startTime;        private String m_text;        private Int32 m_collectionCount;        public OperationTimer(String text)        {            PrepareForOperation();            m_text = text;            m_collectionCount = GC.CollectionCount(0);            m_startTime = Stopwatch.GetTimestamp();        }        private static void PrepareForOperation()        {            GC.Collect();           【 GC.WaitForPendingFinalizers();            GC.Collect();】        }    }}

我要质疑的部分是【】包围的代码(其他部分代码我很清楚其目的),我认为这部分代码从【理论上】可以删除,我的理由是:
C# code
GC.WaitForPendingFinalizers();

挂起当前线程,直到处理终结器队列的线程清空该队列为止。( MSDN的释义)

挂起当前线程是应用程序的线程,处理终结器队列(也即Freachable队列)的线程是CLR专配线程,具有高优先级和特殊待遇,当freachable队列被清空时,会完成对每个对象的Finalize调用,这样对象才成为真正的垃圾。

具备Finalize方法的对象至少需要两次GC(排除代的提升作用),所以后面又加了句GC.Collect(),手动回收那些已经终结的对象的内存。

WaitForPendingFinalizers调用时,会使得应用程序的所有线程挂起睡眠直到所有Finalize方法调用完毕。
那些具备Finalize方法的对象才真正成为垃圾,所以问题来了,这个方法明显是针对处理终结器队列操作的,也就是那些具备Finalize方法的对象,但在这段代码中所有对象都没有析构函数,为何需要调用该方法?!?


[解决办法]
sample just sample...有时候例子就是给人看看怎么写而已,未必有意义...所以,莫钻牛角尖...

ps:我没看过这书,你摘得这段又缺少上下文,说实在的我也不知道它要干什么...你等大侠出现吧...
[解决办法]
恩,值得深思
------解决方案--------------------


LZ学习精神太厉害了,佩服佩服。。
[解决办法]
没有上下文,的确不好判断。不过由于有两次GC.Collect(); 以及IDisposable
猜测是为了说明GC的回收机制。


以下是《C#垃圾回收之二次回收机制 》可能可以应对你的困或。
http://apps.hi.baidu.com/share/detail/14031081
[解决办法]
我的理解是这是一段测试代码,对环境清理是对整个CLR来说的。

虽然你看不到有显示实现 Finalize 的地方。


[解决办法]
换句话说是为了测试代码的健壮性,会不会太扯,哈哈。。。
[解决办法]
终结器队列是干嘛的?
为什么要挂起其它应用程序的线程,然后调用Finalize方法清理内存,清理内存一般放在最后,为什么不终止其它线程?
[解决办法]

这本书看过了。。。但是没注意这个。。。

看上去这个不见得有什么实际意义。。。觉得删除也是可以的



[解决办法]
刚开始看这本书,Mark
[解决办法]
说实话,我还不知道Jeffrey大师呢。
[解决办法]
记忆中好像听人说过是 第一次标记,第二次回收!不清楚!看高手的解答!
[解决办法]
我第一见那种 求解
[解决办法]
就一个编程方式而已。

比如下面例子GetCharacterCount中对参数的检查 - 在本例中它一点都没有用!
你能说它一定用处都没有么?是否有可能别的同事觉得该函数好用,开始调用,甚至拷贝到他们的项目中?
那时候它有用吗?

OperationTimer作为一个密封类,作者写的周到一些,有什么好琢磨的:)

C# code
class Program{    static void Main(string[] args)    {        int i = GetCharacterCount("a?bc?");    }    static int GetCharacterCount(string str)    {        if (str == null) throw new ArgumentException("str");  //<--        return new System.Globalization.StringInfo(str).LengthInTextElements;    }}
[解决办法]
知道个大概就差不多了对于clr没有多深入的严究。如果有那个时不如垃圾收集的原理,并不是.net的垃圾收集。

热点排行