body { font-family: Segoe UI, SegoeUI, Helvetica Neue, Helvetica, Arial, sans-serif }
code { color: rgba(0, 81, 143, 1); background-color: rgba(233, 233, 233, 1); padding: 1px 2px; border-radius: 3px }

一、System.String

string 等价于 System.String

stringSystem.String 的别名。

声明:

 1 string a1 = null;  // 仅仅是一个声明,内存中并没有分配用来存储值的空间。
2
3 string a1 = String.Empty;  // 等价于 "",以新建字符串长度为零的 String 对象,可以减少 NullReferenceException 发生的可能性。
4
5 System.String greeting = "Hello World!";  // 在内存中分配了一个连续性的不可变的储存空间。
6
7 // 长字符串字面量拆分为较短的字符串,从而提高源代码的可读性。
8 // 以下代码将较短的字符串连接起来,以创建长字符串字面量。 在编译时将这些部分连接成一个字符串。 无论涉及到多少个字符串,均不产生运行时性能开销。
9 string text = "Historically, the world of data and the world of objects " +
10 "have not been well integrated. Programmers work in C# or Visual Basic " +
11 "and also in SQL or XQuery. On the one side are concepts such as classes, " +
12 "objects, fields, inheritance, and .NET Framework APIs. On the other side " +
13 "are tables, columns, rows, nodes, and separate languages for dealing with " +
14 "them. Data types often require translation between the two worlds; there are " +
15 "different standard functions. Because the object world has no notion of query, a " +
16 "query can only be represented as a string without compile-time type checking or " +
17 "IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " +
18 "objects in memory is often tedious and error-prone.";

System.String 是不可变类型。 也就是说,出现的用于修改对象的每个操作 System.String 实际上都会创建一个新的字符串。

如下举例:

 1 // 初始化 s1
2 // 内存为 s1 分配了存放字符的空间
3 string s1 = "A string is more ";
4
5 // 初始化 s2
6 // 内存为 s2 分配了存放字符的空间
7 string s2 = "than the sum of its chars.";
8
9 // 内存为 s1 重新分配了新值的空间
10 // 并指向新空间的地址,所以 s1 有了新的值
11 // 无用的s1旧值等待GC垃圾回收
12 s1 += s2;
13
14 System.Console.WriteLine(s1);

以上,假设更多的+或+=等的多次赋值s1,那么 内存在不停的开辟新的空间存放新值赋予s1 ... ... 每次再需要GC分配、压缩、清理... ...

对于执行大量字符串操作的例程 (例如在循环中多次修改字符串的应用程序) ,重复修改字符串可能会显著降低性能。

二、System.Text.StringBuilder

System.Text.StringBuilder对象在缓冲区操作,是一个可变字符串类,缓冲区可随时增加或减少或删除或替换等的字符串的长度。

StringBuilder strb = new StringBuilder();
strb.Append('*', 10).Append(" Adding Text to a StringBuilder Object ").Append('*', 10);
strb.AppendLine("\n");
strb.AppendLine("Some code points and their corresponding characters:");
for (int ctr = 50; ctr <= 60; ctr++) {
strb.AppendFormat("{0,12:X4} {1,12}", ctr,Convert.ToChar(ctr));
strb.AppendLine();
}

三、适用场景

string、String StringBuilder

连续性的不可变的内存空间长度;

开辟新的内存空间存放变更后的值;

借助IndexOf、Substring等进行字符搜索。

缓冲区可伸缩的内存空间长度;

(Chars[])字符搜索方式复杂。

字符更改次数很少;

固定数量的串联拼接操作;

大量的字符串搜索。

大量的未知的不确定的更改次数;

字符串非搜索场景

最新文章

  1. IOS开发 - TextField 控件详细
  2. WebService 用法
  3. windows下面go语言环境搭建
  4. 【贴图】网友 snoopy 用《iHMI43 液晶模块》做的界面给大家看看
  5. 使用SurfaceView播放RGB原始视频-2016.01.22
  6. 随笔2 PAT1001.A+B Format (20)
  7. Android中Java反射技术的使用示例
  8. grivid中切换按钮,两个按钮交替
  9. PHP 7: PHP 变量和常量的定义
  10. jdk源码阅读笔记-Integer
  11. .NET Garbage Collection配置在.net core的写法
  12. 消除2个按钮之间1px细节引起的冲突
  13. 【PAT】B1065 单身狗(25 分)
  14. Pony 编程语言介绍
  15. iOS 禁止手势滑动翻页
  16. 干了2个月java开发最深的体会
  17. mysql与redis的区别与联系
  18. Windoows窗口程序一
  19. 启用代理导致 有道云笔记未知错误、网络错误和OneDrive断线
  20. 【BZOJ3745】Norma [分治]

热门文章

  1. CQGUI框架之阴影圆角窗口实现
  2. Java学习之路 -- Java怎么学?
  3. Android学习之CoordinatorLayout+AppBarLayout
  4. 第三单元总结——JML契约式编程
  5. BUAA_OO_2020_第四单元与课程总结
  6. Linux 用户和用户组管理(useradd userdel groupadd groupdel)
  7. 【笔记】《Redis设计与实现》chapter14 服务器
  8. linux编译安装Apache
  9. 网络编程NIO之Reactor线程模型
  10. Day13_66_sleep()方法 (二)