前言

首先和博园的各位打声招呼,小弟在博园呆了也有一年多了。平常一有时间就会过来看看文章,学习各位的经验,现在养成了一种一天不来博园,心里就不踏实的习惯,不知道在看我博文的大哥们有没有这个感觉。

读归读,理解归理解,所以我现在想把平常所看的,所读的转成自己的理解,记录下来,以便与各位同行们讨论讨论。如果在我博文里有理解错误的,或者没有充分理解的请大胆指出,小弟先在这里拜谢各位了。

  客套话就说到这,下面开始今天的内容。

字符串

  • System.String类

  • System.Text.StringBuilder类

String

  string是各位用的最多的类型之一,是一个特殊的引用类型,直接派生于Object,因此它的值储存在托管堆上。构造一个新字符串的时候,不需要用new。

using System;
class Program
{
static void Main(string[] args)
{
string s = "This is right";//这是正确的
Console.WriteLine(s); string b = new String("This is error");//这是错误的
Console.WriteLine(b);
}
}

  它是”不可变的“。初始化字符串对象后,该字符串对象的长度、内容都是确定不变的了。这个时候,我们需要更改或者添加字符串,会做一个怎样的动作呢?假如会有这一段代码

using System;
class Program
{
static void Main(string[] args)
{
string s = "I am ";
s += "Sky";
Console.WriteLine(s);//我叫Sky
}
}

  1、创建一个新的字符串对象b,运行库会为新对象b分配足够的内存,储存新内容“I am Sky”。

  2、变量 s重新指向新对象b。

  3、旧对象a没有被任何变量引用,等待垃圾回收。

  由于上面的特性,避免复制同一个字符串的多个对象,会利用CLR的字符串留用机制,减少内存的损耗。

  什么是字符串留用,CLR初始化的时候会创建哈希表,每构建一个新字符串都会与哈希表匹配,查找是否有相同的字符串,如果匹配,就会返回这个已存在的旧对象,由新变量进行引用。否则,就会创建一个字符串副本添加到哈希表里,Key就是字符串,Value就是string对象在堆上的地址。

  由上面可见a和b的托管堆上地址是一样的。假如用new呢?经小平子补充,new出来的字符串是不会记录在哈希表的,因此,接下来的字符串与new出来字符串对象是不一样的。

  

StringBuilder

  因为string的”不可变“,导致多次修改字符串的时候会损耗性能,那么这个时候StringBuilder的作用就来了。StringBuilder和String比起来,功能较少,只有基本的属性和增删改的方法。

  其实,StringBuilder是由Char数组构成的。构建新的StringBuilder时能设置容量大小,当添加字符串,超过已分配的数组大小时,就会创建一个新的数组,此时容量会翻倍,旧的数据就会等待垃圾回收。

  StringBuilder多数方法都是返回同一个StringBuilder对象,那么这个时候就可以,几个操作一起完成。

using System;
using System.Text;
class Program
{
static void Main(string[] args)
{
StringBuilder sb = new StringBuilder();
string s = sb.AppendFormat("{0} {1}", "Skyer", "Chen").Remove(,).Replace(' ','-').ToString();
Console.WriteLine(s);//显示结果 Sky-Chen
}
}

  写到这里快江郎才尽了,小弟知识浅薄,日后若有长进定会补上。第一次写博文格式排版有点烂,我发现在大牛们的格式特别漂亮。。起码标题很显眼,恳求各位哥指点指点。

 

最新文章

  1. 在ubuntu16编译安装nginx-1.10.2(full)完全自带组件
  2. 【CUDA学习】GPU硬件结构
  3. HTML: 文檔流是什麼?
  4. Sublime Text3中文乱码及tabs中文方块的解决方案
  5. 【转】Android 实现ListView的滑动删除效果
  6. (转)RPC原理详解
  7. JavaWeb学习笔记之Servlet(一)
  8. UNIX环境高级编程——进程管理和通信(总结)
  9. 类虚函数表原理实现分析(当我们将虚表地址[n]中的函数替换,那么虚函数的实现就由我们来控制了)
  10. Android Apk获取包名和Activity名称
  11. iOS 文本属性
  12. Jquery基础笔记
  13. BZOJ_3223: Tyvj 1729 文艺平衡树 _splay
  14. CSS grayscale滤镜+SVG使图片变黑白实例页面
  15. [Swift]LeetCode206. 反转链表 | Reverse Linked List
  16. 图解Windows下 GIT GUI 使用教程
  17. vue问题大全
  18. [js高手之路]深入浅出webpack教程系列2-配置文件webpack.config.js详解(上)
  19. MUI class="mui-switch" 开关 默认为选中
  20. c# 关于async/await异步编程的浅析和使用

热门文章

  1. js jquery版本的 金额千分位转换函数(非正则,效率极高)
  2. 【C++】【斐波那契】求第几个斐波那契数字。
  3. nginx多域名的配置方法
  4. 陈正冲老师讲c语言void关键字
  5. 多线程程序设计学习(8)Thread-Per-Message
  6. jquery 上传空间uploadify使用笔记
  7. 时间管理(GTD)
  8. 2014上海网络赛 HDU 5053 the Sum of Cube
  9. English Morphology
  10. Java 开发@ JDBC链接SQLServer2012