none
System.Object.Finalize Method RRS feed

  • 问题

  • 在用Reflector加载mscorlib.dll后,看到System.Object类中的Finalize方法是用override修饰的.
    Object是根类,那么重写了谁的方法?
    在SSCLI中,查看Object类的代码,并没有找到Finalize方法..
    各前辈有没有Rotor或Mono的学习资料,Webcast上的视频看过了,想继续深入学习.
    感觉IL语言只是用另一种语言规范重写了DotNet平台上的托管代码而已,没有真正的体现出底层的封装..
    如果想继续向底层学习,应该从哪里入手?该注意些什么?有没有什么资料,书籍?中英文皆可...
    非常感谢.
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月13日 16:20

答案

  • 你好!
         我来解释一下这个问题,为了减轻开发人员的负担,C#中为Finalize方法的定义提供了特殊的语法,用这个语法来定义Finalize方法,编译器可以自动生成合适的异常处理的代码,并调用基类的Finalize方法!

         Object类的Finalize方法的源代码是这样的:
        ~Object()
        {
        }
        可以看到这个方法什么也没有做!

       我们使用ILDasm工具来查看IL代码:
    .method family hidebysig virtual instance void
            Finalize() cil managed
    {
      .custom instance void System.Runtime.ConstrainedExecution.ReliabilityContractAttribute::.ctor(valuetype System.Runtime.ConstrainedExecution.Consistency,
                                                                                                    valuetype System.Runtime.ConstrainedExecution.Cer) = ( 01 00 03 00 00 00 02 00 00 00 00 00 )
      // 代码大小       1 (0x1)
      .maxstack  8
      IL_0000:  ret
    } // end of method Object::Finalize

    这实际上是一个Virtual方法,并不是override其他Virtual方法
        一般类中(如果需要的话)都是重写这个方法来添加终止器实现的。
        Reflector可能没有正确的解析Object类的所以这里Reflector的反编译结果有误,并不是override其他Virtual方法
    周雪峰
    2009年9月14日 4:41
    版主
  • 关于MSIL,我想谈谈自己的观点:

    IL的确不能完全的揭示CLR的原理,但是它可以让我们了解CLR是如何看待我们的代码的,这一点十分的重要!这从某种意义上揭示了CLR的一部分运行原理,而这部分运行原理对开发人员至关重要!
    另外,MSIL可以让我们更加透彻的了解.NET平台的一些编译器的原理,这对解决我们遇到的一些诡异的bug,性能调优都十分的重要!

    所以,我个人认为MSIL对.NET开发人员是很重要的,就如同优秀的C程序员必须要熟悉汇编语言一样!
    周雪峰
    2009年9月14日 4:59
    版主
  • 你好!
         构造一个类的实例的时候,是首先需要从Object构造起的,需要先调用Object的构造函数,但是并不是真的产生一个Object实例!
         注意,如果你个类的Finalize方法只是从Object类继承的,这个类的对象并不被当作终止化对象!只要提供了自己的Finalize实现的类的对象,才被当作终止化对象!
         实际上Object类作为所有类的根,必须提供一个Finalize实现,这样其他类才可以重写这个方法!

         你说的性能损失,只有在回收Object实例的时候才存在,其他的类只有提供了自己的Finalize实现的时候才存在!
    周雪峰
    2009年9月14日 5:20
    版主
  • 编译器会为Attribute生成一些信息,放到元数据中!如此而已!
    反射利用这些元数据来工作!
    周雪峰
    2009年9月14日 5:23
    版主

全部回复


  •  近期推迟出版的
    .NET 探秘:MSIL 权威指南  专门讲解.net底层

    2009年9月13日 16:31
  • 这本书讲的东西不少,但是页数不多.
    不知道会不会是本好书..
    我喜欢少而精的书.
    现在好多书都是很厚,目录很华丽,内容却泛泛而谈..
    我喜欢的书一般都是只讲一两项知识点,全部展开讲解,深入,透彻..
    而且个人感觉,IL语言认识即可,没有必要深入学习.
    就像"老赵"的一篇文章说的那样,IL语言并没有揭示CLR,始终是高级语言的特性.
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月13日 16:39
  • 这本书讲的东西不少,但是页数不多.
    不知道会不会是本好书..
    我喜欢少而精的书.
    现在好多书都是很厚,目录很华丽,内容却泛泛而谈..
    我喜欢的书一般都是只讲一两项知识点,全部展开讲解,深入,透彻..
    而且个人感觉,IL语言认识即可,没有必要深入学习.
    就像"老赵"的一篇文章说的那样,IL语言并没有揭示CLR,始终是高级语言的特性.
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..

    学习没有捷径路只有一点一滴的
    有很多东西 无法用语言表达出来的 net框架上千人开发不是一两人能写出来的 你确定你的方向是开发什么 你尽管研究透底层 做不成什么等于没学一样 
    这本书 未出版 我无法确定好坏的
    2009年9月13日 16:56
  • 其实不一定学习了DotNet就一定要做出什么..
    就像拿一本英语词典,有的人是为了背单词,有的人是查单词.
    查单词人的不能说背单词的人背词典没有意义.
    `
    其实我学这些也仅仅是打发时间,没什么事做而已...一直在学语法,学一些DotNet的处理机制,像垃圾回收之类的..学习平台的思想,而不一定要去如何运用..因为我感觉如果脑袋里不想点什么东西,会觉得空空的,呵呵...
    而且,没有学过底层的人,遇到big case,出现了问题是不可能解决的了的.
    就像是吃饭..大家都在吃饭,可如果谁吃了搭配不当,忌口的东西而出现了不良反应,只有懂得原理的人才能解决,只会吃饭的不可能能解决这种问题..当然,也不可能要求每一个吃饭的人都懂得原理,但至少要知道哪些是忌口的,避免发生问题.不会再出现鲁迅的《药》中的一幕.
    `
    呵呵...不同的人,站在不同的角度,观点不同而已...大家交流,互换心得~
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月13日 17:13
  • 赞成你的观点 不过了解.net底层 我感觉实践项目对底层有很好了解

    2009年9月13日 17:34
  • 你好!
         我来解释一下这个问题,为了减轻开发人员的负担,C#中为Finalize方法的定义提供了特殊的语法,用这个语法来定义Finalize方法,编译器可以自动生成合适的异常处理的代码,并调用基类的Finalize方法!

         Object类的Finalize方法的源代码是这样的:
        ~Object()
        {
        }
        可以看到这个方法什么也没有做!

       我们使用ILDasm工具来查看IL代码:
    .method family hidebysig virtual instance void
            Finalize() cil managed
    {
      .custom instance void System.Runtime.ConstrainedExecution.ReliabilityContractAttribute::.ctor(valuetype System.Runtime.ConstrainedExecution.Consistency,
                                                                                                    valuetype System.Runtime.ConstrainedExecution.Cer) = ( 01 00 03 00 00 00 02 00 00 00 00 00 )
      // 代码大小       1 (0x1)
      .maxstack  8
      IL_0000:  ret
    } // end of method Object::Finalize

    这实际上是一个Virtual方法,并不是override其他Virtual方法
        一般类中(如果需要的话)都是重写这个方法来添加终止器实现的。
        Reflector可能没有正确的解析Object类的所以这里Reflector的反编译结果有误,并不是override其他Virtual方法
    周雪峰
    2009年9月14日 4:41
    版主
  • 感谢雪峰版主..
    不过我觉得,在对象创建时都会创建父类的对象,那么都会创建出一个Object的对象,那么如果Object实现了Finalize方法后,会不会对Object实例的内存回收造成一定的障碍?
    垃圾回收的关于Finalize方法的文章我已细细品读过.
    GC执行两次才能回收掉一个实现了Finalize方法的对象.
    还是说对于Object类,GC有特殊的处理方式?
    呵呵,看源代码的时候忘记了Finalize方法是用和析构方法一样的写法..还是不够熟练啊..
    `
    我一直在找一些关于Attribute的讲解,但大多都是讲解了AttributeUsageAttribute中的属性,继承实现一个自定义的Attibute..并没有太多关于机制的东西..
    雪峰版主有没有好一点的资料,能否提供下.
    如果有关于SSCLI或Mono的资料能否提供一些~~
    感觉资源甚缺,呵呵...
    如果我上面的理解有概念性的问题请指出..
    非常感谢雪峰版主..

    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月14日 4:54
  • 关于MSIL,我想谈谈自己的观点:

    IL的确不能完全的揭示CLR的原理,但是它可以让我们了解CLR是如何看待我们的代码的,这一点十分的重要!这从某种意义上揭示了CLR的一部分运行原理,而这部分运行原理对开发人员至关重要!
    另外,MSIL可以让我们更加透彻的了解.NET平台的一些编译器的原理,这对解决我们遇到的一些诡异的bug,性能调优都十分的重要!

    所以,我个人认为MSIL对.NET开发人员是很重要的,就如同优秀的C程序员必须要熟悉汇编语言一样!
    周雪峰
    2009年9月14日 4:59
    版主
  • 你好!
         构造一个类的实例的时候,是首先需要从Object构造起的,需要先调用Object的构造函数,但是并不是真的产生一个Object实例!
         注意,如果你个类的Finalize方法只是从Object类继承的,这个类的对象并不被当作终止化对象!只要提供了自己的Finalize实现的类的对象,才被当作终止化对象!
         实际上Object类作为所有类的根,必须提供一个Finalize实现,这样其他类才可以重写这个方法!

         你说的性能损失,只有在回收Object实例的时候才存在,其他的类只有提供了自己的Finalize实现的时候才存在!
    周雪峰
    2009年9月14日 5:20
    版主
  • 编译器会为Attribute生成一些信息,放到元数据中!如此而已!
    反射利用这些元数据来工作!
    周雪峰
    2009年9月14日 5:23
    版主
  • 哎....
    真的很谢谢雪峰版主...
    每次提出问题都会来给我解答...
    我学习底层的路还很长...呵呵...
    非常感谢了..


    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月14日 12:18
  • 不客气啊!
    如果想深入了解CLR,可以研究一下《.NET本质论》
    周雪峰
    2009年9月14日 13:47
    版主
  • 恩,但是我看那本书是不是太老了一点...
    好像是2.0发布以前的书了...
    2.0好像更新了不少东西,会不会有写不符合现在的一些东西了..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月14日 13:49
  • 不客气啊!
    如果想深入了解CLR,可以研究一下《.NET本质论》
    周雪峰

    想买 就买不到 郁闷
    2009年9月14日 14:05
  • 这本书有影印版的.
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月14日 14:12
  • 这本书有影印版的.
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..

    我英语不行 只能等我上面介绍那本书
    2009年9月14日 14:22
  • 这本书是Don Box和Chris Sells所著。这本书的特点是对CLR的工作机制讲解比较深入,涉及到较多细节的实现。虽然本书以讲解.NET Framework 1.1为主,但这一点毫不影响本书的价值。工作机制是类似的!
    强烈建议直接看英文版!

    另外,还有一本书也很有参考价值:
    Shared Source CLI essentials
    这本书可是基本上在微软CLR Team内部据说是人手一本
    周雪峰
    2009年9月14日 14:37
    版主
  • 这本书是Don Box和Chris Sells所著。这本书的特点是对CLR的工作机制讲解比较深入,涉及到较多细节的实现。虽然本书以讲解.NET Framework 1.1为主,但这一点毫不影响本书的价值。工作机制是类似的!
    强烈建议直接看英文版!

    另外,还有一本书也很有参考价值:
    Shared Source CLI essentials
    这本书可是基本上在微软CLR Team内部据说是人手一本
    周雪峰

    周大哥 我小学都没毕业 我英语都是一点一滴累积的  我学编程和一般人不一样的 我靠想象力学习这些
    2009年9月14日 14:41
  • 呵呵...也难为你背那么多单词了....
    不过英语还是学学的好,不要求多精湛,至少MSDN和一些技术性的文章,书籍可以看懂就行了....
    计算机的单词不是很多的,单词靠积累嘛...
    看熟了就好了..
    加油哦~

    这本书好像就是在讲SSCLI...
    非常感谢雪峰版主了~
    我还看到一本书叫Shared Source CLI 2.0 Internals
    好像也是在讲CLI,还没仔细看...不过感觉像是本可以的书..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..
    2009年9月14日 14:45
  • 呵呵...也难为你背那么多单词了....
    不过英语还是学学的好,不要求多精湛,至少MSDN和一些技术性的文章,书籍可以看懂就行了....
    计算机的单词不是很多的,单词靠积累嘛...
    看熟了就好了..
    加油哦~

    这本书好像就是在讲SSCLI...
    非常感谢雪峰版主了~
    我还看到一本书叫Shared Source CLI 2.0 Internals
    好像也是在讲CLI,还没仔细看...不过感觉像是本可以的书..
    有人说,充满技术的生活枯燥无味.. 我笑他们不懂.因为只有技术才能充实生活.. 学习就像生活,都需要善于总结,才能发现问题,取得进步.. 生活中充满了数学算式与结构,只要我们善于观察和思考..

    背单词不是问题 因为我没有语言功能 我不会说话 能听到了
    2009年9月14日 14:54