none
遇到怪问题,想请教类实例化的流程 RRS feed

  • 问题

  • 先说说我遇到的怪问题:我从网上下了个万年历的类,他的类中有个构造函数,构造函数就是处理判断传入的参数DateTime 对象日期有没有超出范围,而且将公历转农历等一些操作
    但是就没有求天干地支的代码在这构造函数里。结果我实例化时,在按F10调试时,鼠标移到对象上查看时发现很多属性都算出来了,比如天干地支。真的不明白。
    后来我去查找里面算天干地支的方法,他把天干地支都设置成属性,而且就在set方法里写求天干地支的算法。
    1.我想是不是类初始化时就先执行成员属性的方法,再调用构造函数,但是我在set方法设置断点,实例化对象并单步调试,没有运行到那断点。
    2.我在构造函数的结束括号}那设置断点,调试运行到这时,我查看天干地支的成员变量都没有值的,下一步执行到实例化对象的地方就有值了,不明白他值那里来的。求天干地支的属性set方法都有设断点的,没道理执行了我不知道。
    3.另一个怪事就是,我实例化对象如clender c=new clender(dt)执行完构造函数回来时,鼠标移到c对象上面查看属性,其中有两个public的变量,保存日的天干和地支是没有值的,鼠标移开,在移到c上去,就又有值了,真奇怪,这个类又没有用线程。
    这些问题就引发了我对类实例化的流程的疑问。
    希望知道的人来帮我指引下,谢谢。
    2009年8月4日 5:04

答案

  • 这我知道,但是我为什么会出现上面的这种问题?希望有人可以解答下,或者共同探讨下
    有兴趣的人可以留下你的邮箱,我把那个类文件发给你,帮手看看
    很多属性 是通过核心数据计算的
    比如
    class a  
    {
    datetime _core;
      public a (datatime  core)
     {
         _core=core;
     }

      public int  hour
     {
         get
        {
           return _core.hour;
         }
     }
    }


    在调试状态  watcher 读取hour 属性的时候   属性内部的逻辑自动计算出来相应的信息返回     而不是 在构造类的时候就已经计算好了


    和你你说的状况 似乎还是有所不同 能把代码发上来看看么
    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    • 已标记为答案 梦里人 2009年8月4日 7:53
    2009年8月4日 5:55
    版主
  • 我看了下  跟我说的一样   他把所有运算都写到get 方法了 (不是set 哦)

    在属性的get内写方法  对于这种不算很复杂的内存中的计算   还是比较推荐的   

    如果涉及的不只是这一个结果  而是相关联的很多数据运算   比如数据库中一行的字段   就不太好了  ——  对每个属性的访问都要读一次数据库  消耗就太大了, 要增粒度
    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    • 已标记为答案 梦里人 2009年8月4日 7:52
    2009年8月4日 7:08
    版主

全部回复

  • 在.net 的国际化类库里面 有一个ChineseCalendar  估计有这方面的支持 


    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    2009年8月4日 5:19
    版主
  • 这我知道,但是我为什么会出现上面的这种问题?希望有人可以解答下,或者共同探讨下
    有兴趣的人可以留下你的邮箱,我把那个类文件发给你,帮手看看
    2009年8月4日 5:27
  • 这我知道,但是我为什么会出现上面的这种问题?希望有人可以解答下,或者共同探讨下
    有兴趣的人可以留下你的邮箱,我把那个类文件发给你,帮手看看
    很多属性 是通过核心数据计算的
    比如
    class a  
    {
    datetime _core;
      public a (datatime  core)
     {
         _core=core;
     }

      public int  hour
     {
         get
        {
           return _core.hour;
         }
     }
    }


    在调试状态  watcher 读取hour 属性的时候   属性内部的逻辑自动计算出来相应的信息返回     而不是 在构造类的时候就已经计算好了


    和你你说的状况 似乎还是有所不同 能把代码发上来看看么
    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    • 已标记为答案 梦里人 2009年8月4日 7:53
    2009年8月4日 5:55
    版主
  • 可以发到我的hotmail

    blackshaman_wayne
    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    2009年8月4日 5:58
    版主
  • 刚刚我已经发了那个万年历到你邮箱blackshaman_wayne@hotmail.com去了,麻烦你帮我看看。也麻烦你指点下,写一个类时,怎么组织会好点,像这个类,在set方法里写算法,会不会不好?因为我是新手,而且本身很少这样写代码。
    2009年8月4日 6:26
  • 我看了下  跟我说的一样   他把所有运算都写到get 方法了 (不是set 哦)

    在属性的get内写方法  对于这种不算很复杂的内存中的计算   还是比较推荐的   

    如果涉及的不只是这一个结果  而是相关联的很多数据运算   比如数据库中一行的字段   就不太好了  ——  对每个属性的访问都要读一次数据库  消耗就太大了, 要增粒度
    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    • 已标记为答案 梦里人 2009年8月4日 7:52
    2009年8月4日 7:08
    版主
  • 我懂了,谢谢你的回答,在调试状态  watcher 读取的属性的时候   属性内部的逻辑自动计算出来相应的信息返回  ,所以我看到那些属性有值, 实际上并没有计算出结果的,或者说我看到的结果值在实际用到那个属性时,他才运算get中的方法,计算出属性的值返回。

    2009年8月4日 7:59
  • 我懂了,谢谢你的回答,在调试状态  watcher 读取的属性的时候   属性内部的逻辑自动计算出来相应的信息返回  ,所以我看到那些属性有值, 实际上并没有计算出结果的,或者说我看到的结果值在实际用到那个属性时,他才运算get中的方法,计算出属性的值返回。


    Bingo~~
    答案900, 目标五颗星 Aurvana Air, 音乐真的是随风飘来的 凉宫春日 永无止境的八月 你到底什么时候结束阿。。。。
    2009年8月4日 8:12
    版主