正确操作字符串

引言:

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

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

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

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}.";
}

改善C#程序的方法-1 操作字符串的更多相关文章

  1. C#程序编写高质量代码改善的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

    前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正. 建议1. ...

  2. 改善C#程序的方法

    写在开头: http://www.cnblogs.com/luminji    157个建议_勘误表 一:属性 属性和方法一样.也可以是virtual和abstract. 条款2:运行时常量(read ...

  3. 改善C#程序的方法-2 使用TryParse

    一 使用TryParse,而不是Parse 除string外的所有基元类型,都有两个将string类型转型为其本身类型的方法:Parse 和 TryParse. 以double类型为例,这两个方法最简 ...

  4. 改善C#程序的方法-3 比较器和LINQ排序

    一 创建对象时考虑实现比较器 假设有这样的场景,有一个40个人的学生列表,业务中需针对学生的成绩来进行排序. 可以考虑用IComparable接口和ICompare接口实现: class Progra ...

  5. 编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]

    前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理解的东西,有些地方可能理解的不太到位,还望指正. 建议1. ...

  6. 编写高质量代码改善C#程序的157个建议——建议1:正确操作字符串

    最近拜读了陆敏技老师的<编写高质量代码改善C#程序的157个建议>,感觉不错,决定把笔记整理一遍. 建议1: 正确操作字符串 字符串应该是所有编程语言中使用最频繁的一种基础数据类型.如果使 ...

  7. 改善C#程序,提高程序运行效率的50种方法

    改善C#程序,提高程序运行效率的50种方法   转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET ...

  8. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  9. 编写高质量代码改善C#程序的157个建议——建议2: 使用默认转型方法

    建议2: 使用默认转型方法 除了字符串操作外,程序员普遍会遇到的第二个问题是:如何正确地对类型实现转型.在上一个建议中,从int转型为string,我们使用了类型int的ToString方法.在大部分 ...

随机推荐

  1. jdbc 03:注册驱动的方式

    jdbc连接mysql时,注册驱动的方式 package com.examples.jdbc.o3_注册驱动方式; //mysql驱动所在的包 import com.mysql.jdbc.Driver ...

  2. raspberry pi使用笔记

    1.raspberry pi系统vim问题 习惯了Linux的vim的使用,但是在raspberry pi中,用apt-get install vim后,vim变得很难用,进入编辑模式,输入字母时会莫 ...

  3. YII学习总结6(模板替换和“拼合”)

    controller\helloController.php<?php namespace app\controllers; use yii\web\Controller; class hell ...

  4. React报错之map() is not a function

    正文从这开始~ 总览 当我们对一个不是数组的值调用map()方法时,就会产生"TypeError: map is not a function"错误.为了解决该错误,请将你调用ma ...

  5. 任意N阶幻方算法实现

    算法原理请参考:https://www.zhihu.com/question/23531676 先定义一些通用的函数,比如创建空幻方,删除幻方,打印幻方. 创建幻方 int **NewMagicS(i ...

  6. 【ARK UI】HarmonyOS ETS 资源管理基本使用

    ​代码实现 api讲解 getStringArray getStringArray(resId: number, callback: AsyncCallback<Array>): void ...

  7. APT 安装 MySQL 提示错误:dpkg: error: dpkg frontend lock is locked by another process

    在安装 MySQL 的时候提示错误: ubuntu@VM-0-6-ubuntu:/opt$ sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb dpkg: e ...

  8. Excel 查找函数(一):LOOKUP

    序号 员工姓名 部门 职务 1 苏霞 法务部 法律顾问 2 包志林 财务部 财务总监 3 林娥云 安监部 部长 4 石少卿 质检部 质检员 5 于炳福 生产部 生产部 6 蒋琼志 仓储部 保管员 7 ...

  9. 对Jmeter-基础线程组的一点解释

    概述 线程组是一个测试计划的起点.测试计划中所有元件的运行都必须依托于线程组.每个线程组都会独立的运行测试计划,互不干扰 线程数 线程数在并发用户场景下表示用户数,比如100用户同时发起请求 线程数在 ...

  10. 我就获取个时间,机器就down了

    本文主要讲解linux 时间管理系统中的一个问题 背景:linux 时间管理,包含clocksource,clockevent,timer,tick,timekeeper等等概念 , 这些概念有机地组 ...