正确操作字符串

引言:

字符串是使用很频繁的一种数据类型。

如果使用不慎,则会为一次字符串操作所带来的额外性能开销而付出代价。

下面从这几个方面来探讨如何正确操作字符串:

1.确保尽量少的装箱,尽可能避免编写不必要的装箱代码

string str1 = "str1" + 8;               //运行时会完成一次装箱行为
string str2 = "str2" + 8.ToString(); //没有发生装箱行为,效率更高

2.避免分配额外的内存空间

在CLR中,string类是特殊的引用类型,string对象一旦被赋值就不可改变。

在运行是调用System.String类中的任何方法或进行任何运算(如“=”赋值,“+”拼接),都会在内存中创建一个新的字符串对象,

要为该新对象分配新的内存空间。

private void Method()
{
string str1 = "abc";
str1 = "123" + str1 + "456";
//以上代码创建了3个字符串对象,并执行了一次string.Concat方法,会带来运行时的额外开销。
}

3.使用StringBuilder类

微软提供的StringBuilder类型可以弥补String的不足。

StringBuilder不会重新创建一个string对象,它的效率源于预先以非托管的方式分配内存。

如果StringBuilder没有预先定义长度,则默认分配的长度为16。

当StringBuilder字符长度≤16时,StringBuilder不会重新分配内存;

当长度大于16小于32时,StringBuilder会重新分配内存,使之成为16的倍数。

StringBuilder指定的长度要合适,太小了需要频繁分配内存,太大了则浪费空间。

public static void Method1()
{
StringBuilder sb = new StringBuilder("我");
sb.Append("是");
sb.Append("一个");
sb.Append("程");
sb.Append("序");
sb.Append("员");
string str = sb.ToString();
}

4.使用string.Format方法

string.Format方法在内部使用StringBuilder进行字符串的格式化,可以简化StringBuilder操作。

public static void Method2()
{
string str = string.Format("{0}{1}{2}{3}","我","是","一个","程序员");
}

5.使用内插字符串 $

内插字符串$是string.Format的语法糖,可以更直观的表达参数。

public static void Method3()
{
var name = "小明";
var year = 20;
var job = "程序员";
var str = $"{name}的年龄是{year},工作是{job}.";
//注意:
//上条内插字符串中的year是int类型,会发生装箱操作,影响性能
//可以优化为:var str = $"{name}的年龄是{year.ToString()},工作是{job}.";
}

最新文章

  1. BZOJ-2127-happiness(最小割)
  2. Android之AnimationDrawable初识
  3. .net混淆、反编译工具调查
  4. SqlServer 18456 错误解决方案
  5. Storm TimeCacheMap RotatingMap源码分析
  6. 关于在windows下使用mingw并行编译wxwidgets时的错误
  7. Grid分组汇总
  8. 基于Jquery 的 Chart
  9. 【Android】 图片编辑:创建圆角图片
  10. Robotium学习笔记二
  11. Android应用切换皮肤功能实现(二)
  12. cocos2dx tag和zorder
  13. [SDOI 2008]仪仗队
  14. Apache 、Tomcat、Nginx的区别
  15. [ZJOI2008]树的统计-树链剖分
  16. k8s与云服务器之间服务互访之节点网络打通
  17. 深入浅出JAVA线程池使用原理1
  18. First Wainberg-2018-Deep learning in biomedicine Experience
  19. toolTip(用svg制作出富有动态的对话框)
  20. 在dosbox窗口显示a~z

热门文章

  1. python 进程理解
  2. Linux学习系列--用户(组)新增、查看和删除
  3. reduce累加实现
  4. odoo 14 Debug 调试
  5. 内存问题难定位,那是因为你没用ASAN
  6. 【达人专栏】还不会用Apache Dolphinscheduler吗,大佬用时一个月写出的最全入门教学【二】
  7. Redis 08 地理位置
  8. java-servlet过滤器和监听
  9. 2020牛客NOIP赛前集训营-提高组(第二场)- B.包含 (FWT)
  10. 前端利器躬行记(8)——VSCode插件研发