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

展开答案

其实这并不困难,只要简单“推理”一番便可。虽然StringBuilder的Append方法没有依赖String.Concat方法,但这只能说明Append方法没有直接调用String.Concat。然而,只要Append方法有机会调用到我们自定义的逻辑中,便可以由我们的逻辑调用Concat方法。这样的方法可以是Append(object)重载:

public StringBuilder Append(object value)
{if (value == null){return this;}return this.Append(value);
}

那么,我们的方法可以调用String.Concat方法,但又如何让它抛出异常呢?很容易,因为String.Concat方法也有个Concat(object, object)重载会调用参数的ToString方法。不过,如果我们直接调用String.Concat方法也太不自然了些,相信之前那位朋友也不会这么做。但是,其实我们完全可以:

public class InBuilder
{public override string ToString(){return "Hello" + new InConcat();}
}public class InConcat
{public override string ToString(){throw new Exception();}
}static void Main()
{var builder = new StringBuilder();builder.Append(new InBuilder());
}

看InBuilder的ToString中,将一个字符串与另一个非字符串对象连接起来,而这个连接操作便会被编译为String.Concat(object, object)方法:

.method public hidebysig virtual instance string ToString() cil managed
{.maxstack 8L_0000: ldstr "Hello"L_0005: newobj instance void SimpleConsole.Program/InConcat::.ctor()L_000a: call string [mscorlib]System.String::Concat(object, object)L_000f: ret
}

于是执行Main方法便会抛出一个异常,它的StackTrace便是:

at SimpleConsole.Program.InConcat.ToString() in ...at SimpleConsole.Program.InBuilder.ToString() in ...at SimpleConsole.Program.Main() in ...
...

嘿嘿,我是不是很无聊?

转载于:https://www.cnblogs.com/JeffreyZhao/archive/2009/12/04/stack-trace-with-StringBuilder-and-String-Concat.html

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

  1. Python实验,用pygame做飞机大战游戏设计

    飞机大战游戏设计 摘 要:根据课程要求,以及面向对象程序设计的编程思想,在Windows操作系统环境下,运用PyCharm编译程序,以Python语言为开发语言,最终实现飞机大战游戏相应的游戏操作功能 ...

  2. 游戏设计的艺术:一本透镜的书——第二十五章 好的游戏是通过游戏测试做出来的

    这是一本游戏设计方面的好书 转自天之虹的博客:http://blog.sina.com.cn/jackiechueng 感谢天之虹的无私奉献 Word版可到本人的资源中下载 第二十五章好的游戏是通过游 ...

  3. 《通关!游戏设计之道》笔记(二) 游戏是哪些人做的

    前言: 关于本文的一些分类,是书中作者根据他多年的工作经验和他自己的专业知识来进行分类的,这里也是给大家还有我自己普及知识,仅此而已. 正文: 游戏种类有很多,做游戏的人也分很多类.做游戏的队伍一般被 ...

  4. 游戏设计的作品集到底该怎么做?

    由于目前相关教育相对落后,学校授课内容也几乎仅与游戏美术相关,整体游戏的设计思维不成系统,即便存在好的游戏想法,也不知如何施展. 这样的尴尬境地使得很多同学选择出国留学,借助国外先进知识实现自己做一款 ...

  5. 哈工大游戏设计复习题

    哈工大游戏设计复习题 由于网络上以及授课老师没给,我在这借用下学长给的资料,希望能给与现在学习的同学.未来学习的师弟师妹一些帮助. 什么是游戏:游戏是一种娱乐活动.是本身具有特定的流程模式.规则条件. ...

  6. 基于java的俄罗斯方块小游戏设计(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 题 目          小游戏开发 摘    要     俄罗斯方块是我们最常见的游戏之一,该 ...

  7. 基于Java的雷电游戏设计(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 基于Java的雷电游戏 摘   要    电脑游戏,是指在计算机上能够运转的游戏软件.这种软件具 ...

  8. java毕业设计——基于java+J2ME+sqlserver的打飞机游戏设计与实现(毕业论文+程序源码)——打飞机游戏

    基于java+J2ME+sqlserver的打飞机游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME+sqlserver的打飞机游戏设计与实现,文章末尾附有本毕业设计的 ...

  9. 【java毕业设计】基于java+swing+GUI的连连看游戏设计与实现(毕业论文+程序源码)——连连看游戏

    基于java+swing+GUI的连连看游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+GUI的连连看游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦 ...

最新文章

  1. 8个免费实用的C++GUI库
  2. boot loader:Grub
  3. 别再找了!全网最全的数据分析全流程攻略在这
  4. ElementUI项目中怎样引用Jquery
  5. Boost::context模块fiber的无限循环测试程序
  6. pd快充线无法连接计算机,华为快充连接扩展坞再接计算机,无法正常充电
  7. 被寄予厚望的区块链 能否为游戏行业带来新的曙光?
  8. C#循环语句(for循环)
  9. 【转】2.5SharePoint服务器端对象模型 之 访问网站和列表数据(Part 5)
  10. IDEA安装“Translation”插件
  11. 【机器学习-西瓜书】二、模型评估:过拟合;自助法;交叉验证法
  12. 打不开文件F:\vmware -副本\Ubuntu 16.vmdk:该虚拟机的磁盘已经由虚拟机或者快照使用
  13. jQuery 的 ajax
  14. sql语法、特殊符号及正则表达式的使用
  15. Python实现数据技术|爬虫便可获取免费百度文库付费文档
  16. 基于FFT的平面阵列方向图综合
  17. 基于SSM生产计划排程管理系统
  18. 软件附带有广告如何消除
  19. Vue启动项目报错:Can‘t resolve ‘xxx‘ in ‘D:\briup\vue_test\node_modules\send‘
  20. Duplicate Removal

热门文章

  1. mybatis注解详解
  2. Hibernate validation annonation
  3. linux用户态驱动--VIFIO、IOMMU、UIO(二)
  4. KVM创建虚拟机(六)
  5. restclient发送json_怎么使用restclient来发送post请求参数
  6. 小猿圈零基础怎样学好java?
  7. shell编程-条件判断
  8. 专访阿里资深研发工程师窦贤明:PG与商业数据库差距并不明显
  9. [ORACLE错误]oracle 不能更新 PL/SQL 点击“edit data”报“ these query results are not updateable”...
  10. 非常实用的Windows7进阶功能