Hello World
Spiga

做个游戏:设计代码生成特定的调用堆栈

2009-12-04 00:30 by 老赵, 4458 visits

前篇文章里我谈了谈String.Concat与StringBuilder的实现,于是后来有个朋友回复到:“我发现StringBuilder里好像也用了String.Concat。在一次异常中,Exception的StackTrace显示是先发生了String.Concat异常,然后再StringBuilder.Append。”不过经过一些简单的分析,我们会发现StringBuilder.Append方法的各个重载都没有依赖(即调用)String.Concat方法,那么这样的调用堆栈又是如何形成的呢?

展开答案

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

21 条回复

  1. Flyear
    *.*.*.*
    链接

    Flyear 2009-12-04 00:34:00

    老赵的沙发第一次占, 不过这个研究一下也不错,至少自己心里明白.

  2. 老赵
    admin
    链接

    老赵 2009-12-04 00:41:00

    @Flyear
    我明白了一件事,就是编译器对于这种情况,是用String.Concat(object,object),而不是先ToString再String.Concat(string, string)。
    虽然明白这个也没太大意义。

  3. Flyear
    *.*.*.*
    链接

    Flyear 2009-12-04 00:49:00

    哈哈,还没怎么仔细看呢, 明天好好看看,我再不休息,又该迟到了,都早点休息吧,哈哈.

  4. Ivony...
    *.*.*.*
    链接

    Ivony... 2009-12-04 01:19:00

    Jeffrey Zhao:
    @Flyear
    我明白了一件事,就是编译器对于这种情况,是用String.Concat(object,object),而不是先ToString再String.Concat(string, string)。
    虽然明白这个也没太大意义。




    我也明白一件事情,原来String没有重载+运算符,而是编译器直接识别+

  5. 徐少侠
    *.*.*.*
    链接

    徐少侠 2009-12-04 07:21:00

    积小知识为大智慧

  6. 幸存者
    *.*.*.*
    链接

    幸存者 2009-12-04 08:26:00

    Jeffrey Zhao:
    @Flyear
    我明白了一件事,就是编译器对于这种情况,是用String.Concat(object,object),而不是先ToString再String.Concat(string, string)。
    虽然明白这个也没太大意义。


    这个算是最基本的常识么?
    没有哪个方法会为了让参数符合它本来不符合的方法签名而在进入方法之前调用ToString吧,都是在重载版本里ToString的。

  7. 老赵
    admin
    链接

    老赵 2009-12-04 08:47:00

    Ivony...:
    我也明白一件事情,原来String没有重载+运算符,而是编译器直接识别+


    这点其实我在这里就意识到了,hoho
    http://www.cnblogs.com/JeffreyZhao/archive/2009/11/13/general-add-operation.html

  8. 老赵
    admin
    链接

    老赵 2009-12-04 08:47:00

    @幸存者
    真的在这里设计一个特例也没有什么问题吧,既然String的+操作本来就是由编译器特例化的操作符。
    而且要讨论这个问题还会涉及到,究竟是先有+这个特例化的操作符,还是先有String.Concat(object,object)这个重载……

  9. 老赵
    admin
    链接

    老赵 2009-12-04 08:48:00

    从昨天晚上开始博客园发评论就恶心地不断超时

  10. Will Meng
    *.*.*.*
    链接

    Will Meng 2009-12-04 09:02:00

    Jeffrey Zhao:从昨天晚上开始博客园发评论就恶心地不断超时


    果然不能发表评论了,我看这个代码是用ajax调用的webservice来实现的,不是webservice出现问题了吧。。。

  11. lovecherry
    *.*.*.*
    链接

    lovecherry 2009-12-04 09:44:00

    hoho 出个面试题 根据调用堆栈生成测试代码

  12. mysun
    *.*.*.*
    链接

    mysun 2009-12-04 10:43:00

    这篇很有用,不知老赵能否针对 ado.net 性能写点东西,因为最近一直在争论,我不认为用所有的地方都用ado.net是提高性能。有的朋友一次把数据取出来,放在session中,说只要不与数据库操作就是提高性能。能否在这方面做个分析,期待!,谢谢

  13. 老赵
    admin
    链接

    老赵 2009-12-04 10:45:00

    @mysun
    在.net程序中,有不用ado.net访问数据库的方法吗?

  14. mysun
    *.*.*.*
    链接

    mysun 2009-12-04 10:51:00

    不是说连接数据库不用ado.net 我是说一次将数据读出后将这个dataset放入Session中,然后整个页面都操作这个dataset,如果有更新回数据库的操作,就用update将其更新回去,类似这样的操作是否合理,谢谢

  15. oec2003
    *.*.*.*
    链接

    oec2003 2009-12-04 11:27:00

    Jeffrey Zhao:从昨天晚上开始博客园发评论就恶心地不断超时


    嗯 昨天发了好多次都发不上去

  16. 装配脑袋
    *.*.*.*
    链接

    装配脑袋 2009-12-04 11:44:00

    Ivony...:

    Jeffrey Zhao:
    @Flyear
    我明白了一件事,就是编译器对于这种情况,是用String.Concat(object,object),而不是先ToString再String.Concat(string, string)。
    虽然明白这个也没太大意义。




    我也明白一件事情,原来String没有重载+运算符,而是编译器直接识别+



    如果会VB的话老早就能发现了哦^_^

  17. 老赵
    admin
    链接

    老赵 2009-12-04 13:06:00

    @装配脑袋
    VB最坏了,哈哈

  18. CoolCode
    *.*.*.*
    链接

    CoolCode 2009-12-04 13:27:00

    oec2003:

    Jeffrey Zhao:从昨天晚上开始博客园发评论就恶心地不断超时


    嗯 昨天发了好多次都发不上去


    我当时还以为是chrome问题

  19. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2009-12-04 16:03:00

    @mysun
    用好了就合理 ^_^

  20. hahaer[未注册用户]
    *.*.*.*
    链接

    hahaer[未注册用户] 2009-12-05 11:45:00

    拼命的数据库超时..我insert都超时!不知道博客园什么架构!
    估计是跑什么大的应用锁表了
    Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

  21. 老赵
    admin
    链接

    老赵 2009-12-05 15:31:00

    @hahaer
    估计只是哪儿出bug了而已,也不知道是不是数据库,不过可能性的确大些。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我