博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 拼接字符串的几种方式和性能
阅读量:5160 次
发布时间:2019-06-13

本文共 1810 字,大约阅读时间需要 6 分钟。

开发过程中常用到的拼接字符串的方法有三种:

  1 简单 “+=” 拼接法

    

1
2
3
4
5
string 
str=
"a"
;
 
str+=
"c"
+
"d"
;
 
string 
str_1=
"a"
+
"b"
;

  

  首先需要明白的是string类型,string是引用类型,保留在堆上,而不是栈上,用的时候传的是内存中的地址,每次修改就会重新创建一个新的string对象来存储字符串,原有的会被自动回收。

  第一种方式的实现原理,第一步先在内存中分配空间,存储str变量的对象,值为"a", “+=”时,又会重新创建一个对象来存储新的字符串(“abc"),把str指向这个新的地址。所以只有简单几步的拼写时,一般不会有太大问题,如果有时候需要循环拼接时,就会不断创建新的对象,很浪费性能和内存。

  2 String.Format()

 

1
string 
str= String.Format(
"{0}{1}{2}"
,
"a"
,
"b"
,
"c"
);

  

  这就需要先看看他的源代码了,

1
2
3
4
5
6
7
public 
static 
String Format(IFormatProvider provider, String format, 
params 
Object[] args) <br>{
    
if 
(format == 
null 
|| args == 
null
)
      
throw 
new 
ArgumentNullException((format==
null
)?
"format"
:
"args"
);
    StringBuilder sb = 
new 
StringBuilder(format.Length + args.Length * 8);
    sb.AppendFormat(provider,format,args);
    
return 
sb.ToString();
}

  可以看到是先创建一个StringBuilder类型的变量,长度为第一个参数的长度+参数长度的8倍。.Net自动分配一个比较大的容量来存储。StringBuilder的介绍请看第3种方法.

  这种方式的代码看起来比较整洁,易于月度,效率也比+=高效很多。

3 StringBuilder.Append

 

1
2
3
StringBuilder str=
new 
StringBuilder();
 
str.Append(
"a"
);

  

   StringBuilder 是预先创建一个比较大的内存,以后每次操作时判断容量上限是否不够用,如果不够用就自动把容量扩大一倍,修改的还是第一次创建的对象的值。

 

如果是简单的拼写时,可以用 "+=", string.format

循环内拼写很长的字符串时,就需要用到StringBuilder来节省性能和内存了。

 

4    C# 6.0的、、、VS 2015支持

C#中$的用法:是为了替代string.format();原先赋值需要占位符和变量,当需要拼接多个变量会造成语句过长等不易理解问题,$""是为了替代string.format(),可以把字符串中的C#变量{}包含起来达到识别C#变量的目的$"{id}";也支持表达式,使用$"{(你的表达式)}"

 

[csharp] 
 
 
  1. var k = "a";  
  2.  var a0 = "User";  
  3.  var a1 = "Id";  
  4.  var a2 = 5;  
  5.  var ccc = string.Format("select * from {0} where {1} = {2}", a0, a1, a2);  
  6.  var ccb = $"select * from {a0} where {a1}={a2}";  

 

 

 

当然也支持string.format()里面的格式,如:

 

[csharp] 
 
 
    1. var k = "a";  
    2. var k4 = $"{k,5}";  
    3. var k3 = string.Format("{0,5}", k);  
    4.   
    5. var k2 = DateTime.Now;  
    6. var c = $"{k2:yyyy}";  
    7. c = string.Format("{0:yyyy}", k2);  

转载于:https://www.cnblogs.com/shiyh/p/6971099.html

你可能感兴趣的文章
jdbc连接数据库方式问题
查看>>
一步一回头撞在了南墙上
查看>>
POJ2965 The Pilots Brothers' refrigerator
查看>>
C# 2.0 中的新增功能01 分布类与分部方法
查看>>
关于腾讯ip接口一个流传很广的错误用法
查看>>
java 浅拷贝和深拷贝
查看>>
unity如何判断应用的运行平台
查看>>
LAMMPS脚本1
查看>>
Kubernetes 1.10.4 镜像 版本
查看>>
[每天进步一点 -- 流水账]回顾总结
查看>>
[小明学算法]6.字符串匹配算法---KMP
查看>>
url的处理
查看>>
(原创)c#学习笔记10--定义类成员02--类成员的其他议题02--调用重写或隐藏的基类方法...
查看>>
windbg学习----$$(注释说明符)和*(注释行说明符)和.echo
查看>>
驱动学习---PAE--virtual address to physics address
查看>>
注销优酷账户
查看>>
Directory类总结
查看>>
LoadRunner 接口测试 第二章
查看>>
Nginx 负载均衡
查看>>
activeMQ类型转换器
查看>>