正确操作字符串

引言:

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

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

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

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. Taurus.MVC 如何升级并运行在NET6、NET7

    前言: 之前计划帮某公司架构一个从WPF转向Web的低代码的开发平台,并构思为Taurus.MVC 新增微服务的基础功能模块,提供便捷的微服务开发方式,因中途合作中止,代码开发部分后续再上. 最近看到 ...

  2. Linux安装mysql8.0.29详细教程

    ​ 我在上午卸载了陪伴我多年的mysql5.7,现在准备安装mysql8.0. 一.登录mysql官网下载mysql安装包(我的系统是Centos7) MySQL :: Download MySQL ...

  3. 重写Object的equals方法和Objects的equals方法

    Object类的equals方法默认比较的是两个对象的地址值,没有意义 所以我们需要重写equals方法,比较两个对象的属性值(name,age等等): 对象的属性值一样返回true否则返回false ...

  4. 叫高二上一调?简要题解 (ACD)

    A. 电压机制 题意转换为所有奇环的并排除掉所有偶环留下的边的个数 . 建出 DFS 树,然后只有返祖边可能构成环 . 于是类似树上差分,\(odd_u\) 统计奇环,\(even_u\) 统计偶环 ...

  5. Python 汽车之家 全系车型参数(包含历史停售车型) 最全

    本文仅供学习交流使用,如侵立删!联系方式及demo下载见文末 汽车之家2021 全系车型参数(包含历史停售车型) 2021.10.21更新 增加参数:电动扰流板.无框设计车门.隐藏电动门把手.自动驾驶 ...

  6. Apache DolphinScheduler之最美好的遇见

    关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...

  7. Go语言Tips

    时间日期格式化 time.Now().Format("2006-01-02") 原生DefaultServeMux支持restful路由 ref: https://towardsd ...

  8. 一文带你认知定时消息发布RocketMQ

    摘要:DMS任意时间定时消息能力发布. DMS是华为云的分布式消息中间件服务.适用于解决分布式架构中的系统解耦.跨系统跨地域数据流通.分布式事务协调等难题,协助构建优雅的现代化应用架构,提供可兼容 K ...

  9. C# 使用SIMD向量类型加速浮点数组求和运算(1):使用Vector4、Vector<T>

    作者: 目录 一.缘由 二.使用向量类型 2.1 基本算法 2.2 使用大小固定的向量(如 Vector4) 2.2.1 介绍 2.2.2 用Vector4编写浮点数组求和函数 2.3 使用大小与硬件 ...

  10. 文心大模型api使用

    文心大模型api使用 首先,我们要获取硅谷社区的连个key 复制两个api备用 获取Access Token 获取access_token示例代码 之后就会输出 作文创作 作文创作:作文创作接口基于文 ...