最近闲来之余,看了一些开源的类库,看到有些类库喜欢用TextWriter类来记录相关的字符串数据,感到比较好奇,为啥不用StringBuilder类对象。于是在网上搜索了一番,总结了相关笔记。

StringBuilder类

在 .net 中,字符串作为一种基本的数据类型,通常在一个程序中同一个字符串只维护一个副本。也就是说,通过直接给定字符串值的字符串引用会引用到相同数据上。这种处理的好处在于它能够减少字符串所占用的内存空间,不需要为多个同样的字符串开辟多次空间。在C#中 string 类型是一个不变量,给字符串引用赋予新值并不会改变对应内存中的数据,而是设置引用为新字符串位置。

在平时,这种处理逻辑能够大大减少字符串所占用的内存空间,但有的时候,也会起一些反效果,典型的例子就是在一些构造字符串的操作时所生成的中间字符串数据。举个例子:

这是一个很简单的字符串组装功能,它将给定的单词拼接成一个句子,我们希望的是直接拼接成最后的结果,但这段代码除了生成最终句子外,先前的临时也会生成出来。也就是说,"Nice "、"Nice to "、"Nice to meet "以及最后字符串"Nice to meet you."会随着一次次循环迭代全部构造出来。

但实际上,对于我们来说只需要最后句子即可,中间部分完全不需要。为此,我们需要新的方式来避免无意义的开销。

StringBuilder就是一种动态灵活地构造字符串的方法。这种构造字符串的好处在于,它能够避免构造中间字符串结果,转而直接生成最终的字符串数据。按照上面的例子,稍作修改就能得到一个性能更加优异的版本,在该版本下只有最后的句子字符串才会被生成。

至于StringBuilder的原理,我个人猜测是该类中维护一个char型列表,然后动态地修改数组元素,达到每次拼接时不会生成字符串的目的,只有当显式调用命令生成时,才会生成。不过,因为能力有限,我还不知道怎么在runtime这个开源库中找StringBuilder的实现。

TextWriter类

TextWriter是一个抽象类,按照微软官方给出的描述,该类指的是可以编写一个有序字符系列的编写器。嗯,字都认识,但是这句话感觉就不像是人说的。实际上,我个人对这个类的理解是它是一个写入器。换句话来说,TextWriter描述了一个写入的过程,但具体写什么?向哪里写入?这不是这个抽象类所关心的话题,而是由其子类所负责。

.net中常用内置的一些子类:

  • StreamWriter :这个类相信很多人都熟悉,当需要向文件中写入数据时,往往通过该类写入数据

  • StringWriter :今天本文所需要研究的对象,向字符串写入

  • HttpWriter : 向网络流中写入数据

StringWriter类作为TextWriter的一个继承类,按照MSDN给出的解释是,用于将信息写入字符串的TextWriter类对象,这个类看起来和StringBuilder类所做的功能差不多,那么为什么在 .net 中设计两个不同类做同一个功能呢?

翻了下相关资料,只能说这两个类是不同设计思路下的产物。StringBuilder是一种灵活构建字符串的类,它不会产生额外的临时字符串,而StringWriter则将字符串数据作为一种写入的目的地,从这个角度来看,确实也是一种必要的实现。

比如说,有一个函数,它专门是将字符串数据记录下来,具体点,可以想像为日志记录器将日志信息记录到某个地方。这样的情况下,我们提供两个输入参数,TextWriter类对象表明是一个写入器,message描述一个日志信息,那么记录数据只需要这样写就可以了:

这样一来,如果将信息记录到某个文件中,只要这样写:

如果想将信息记录到某个变量中,就是这样:

总结

总的来说,如果只是单纯使用字符串而不涉及到修改字符串值时,直接使用string类型即可。如果需求是更加专注构造某种字符串数据,那么使用StringBuilder是一个比较好的选择。如果需求强调的是将某种格式的字符串数据写入到某个介质中,使用TextWriter对应的继承类会更好,更符合封装的思想,且不需要过多关注数据是怎么写入的,只要将需要写入的数据传入到其中即可。

本文转载自博客园:

https://www.cnblogs.com/iskcal/p/difference_between_stringbuilder_and_textwriter.html

.net runtime占用cpu_.net 中的StringBuilder和TextWriter区别相关推荐

  1. .net runtime占用cpu_追踪将服务器CPU耗光的凶手!

    前面我们讨论系统调用的时候结论是耗时200ns-15us不等.不过我今天说的我的这个遭遇可能会让你进一步认识系统调用的真正开销.在本节里你会看到一个耗时2.5ms的connect系统调用,注意是毫秒, ...

  2. 在PHP中实现StringBuilder类

    在PHP中实现StringBuilder类 在asp.net开发开发环境中,有一个StringBuilder类是比较常用的, 这个类用起来可以实现很方便的text文本的操作. 但是在php中,没有这个 ...

  3. java stringbuffer 转数组_JAVA之旅(十七)——StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder...

    JAVA之旅(十七)--StringBuffer的概述,存储,删除,获取,修改,反转,将缓存区的数据存储到数组中,StringBuilder 讲完String,我们来聊聊他的小兄弟 一.StringB ...

  4. C#中在窗体应用中使用StringBuilder拼接显示网页

    场景 CS中使用StringBuilder拼接html显示网页. 效果 实现 新建窗体应用 拖拽控件WebBrower用来显示网页. 拖拽之后,默认是停靠父容器,点击右上角,取消停靠父容器. 取消之后 ...

  5. Java中的String,StringBuffer,StringBuilder有什么区别?

    相信有很多同学都是经常使用String的,或者也或多或少的听说过StringBuffer,StringBuilder,那么在经常遇见的面试题中(标题),到底这三个的区别是什么呢?让我们来一探究竟! S ...

  6. mysql中char与varchar的区别分析(补充一句,int和integer没区别)

    转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  7. mysql''和null,mysql中NULL和null的区别

    接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...

  8. python yield用法_Python中迭代器和生成器的区别?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  9. 原 c++中map与unordered_map的区别

    c++中map与unordered_map的区别 头文件 map: #include < map > unordered_map: #include < unordered_map ...

最新文章

  1. SQL 交集 差集 并集 笛卡尔积 应用实例
  2. 【ARM】一步一步移植Linux Kernel 2.6.13到板子
  3. struts2 spring hibernate 原理
  4. 现实世界的Windows Azure 视频:新南威尔士州教育部(DET)利用Windows Azure实现在线科学测验...
  5. Android8.0 开机启动脚本,Android开机启动shell脚本(Android 8.0测试OK)
  6. ggplot2分面柱状图柱子比例一致_R语言柱状图
  7. js实现下载 .txt文件
  8. java itext 页边距_iText的用法
  9. 四旋翼无人机飞控系统设计(基础知识篇)
  10. 用双轨驶向未来:千兆宽带将如何改变我们的家庭生活?
  11. 后台网站首页设计过程
  12. express項目部署阿里云服务器
  13. 使用FreeMarker导出固定格式word文档
  14. Ant Design Pro 企业级后台实战(73 个视频)
  15. 一笔一划教你写一签名
  16. 逻辑回归中的梯度下降法
  17. 张飞硬件课程第六部:开关电源(上)
  18. Lighting System Design UVA - 11400 dp 更换灯泡
  19. Flink SQL 核心解密 —— 提升吞吐的利器 MicroBatch
  20. Xcode7中你一定要知道的炸裂调试神技

热门文章

  1. Redis学习笔记--Redis数据过期策略详解==转
  2. cf414B(dp)
  3. switch…case语句注意事项
  4. 对Xml文档进行操作(修改,删除)
  5. 使用redis做为MySQL的缓存
  6. spring-boot注解详解(二)
  7. 汇编 --- 栈结构的妙用
  8. CenterOs 防火墙设置
  9. 同批号不同批次同一单据中出现数量不限制
  10. 58或与赶集合并,几人欢喜几人愁