• C# 拼接字符串的几种方式和性能


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

      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来节省性能和内存了。

    c# 中 $符号的用法   C# 6.0的、、、VS 2015支持

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

    [csharp] view plain copy
     
    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] view plain copy
     
      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);  
  • 相关阅读:
    详解prototype、proto和constructor的关系
    BFC
    transition(动画属性)
    React组件生命周期
    正则限制input只能输入大于0的数字
    msbuild编译
    python 在头文件添加 #include "stdafx.h"
    2017年感想
    chVsprintf
    富文本测试
  • 原文地址:https://www.cnblogs.com/shiyh/p/6971099.html
Copyright © 2020-2023  润新知