c#编程最佳实践:使用Stringbuilder代替String, 少用format

始终使用Stringbuilder进行字符串连接操作

这一点对开发人员来说非常关键。在进行大量字符串拼接操作时,请使用StringBuilder代替String。为了演示它对代码性能的影响,我准备了以下示例代码。我在for循环中执行了500次字符串拼接操作。

public classTest{    public static string Name { get; set; }    public static string surname;  }  class Program{    static void Main(string[] args)    {        string First = "A";        StringBuilder sb = new StringBuilder("A");
        Stopwatch st = new Stopwatch();        st.Start();        for (int i = 0; i < 500; i++)        {            First = First + "A";        }        st.Stop();        Console.WriteLine("Using String :-" + st.ElapsedTicks);        st.Restart();
        for (int i = 0; i < 500; i++)        {            sb.Append("A");        }        st.Stop();        Console.WriteLine("Using Stringbuilder :-" + st.ElapsedTicks);        Console.ReadLine();    }}

 这是输出:

图片

 

我已经展示了在长连接操作的场景中字符串的速度有多慢。这里我们会看到一个字符串和StringBuilder的内存分配图。让我来演示一下。下面是我使用字符串和StringBuilder进行相同操作的代码。

  •  
  •  
  •  
using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.Diagnostics;  using System.IO;  using System.Net;  using System.Net.NetworkInformation;  using System.Threading;  using System.Globalization;  using System.Data.SqlClient;  namespace Test1  {      public class Test1      {          string Name ;          public void Process()          {              Name = Name + "A";          }      }      public class Test2      {          StringBuilder sb = new StringBuilder();          public void Process()          {              sb.Append("A");          }      }      class Program      {          static void Main(string[] args)          {              Test1 t = new Test1();              t.Process();               Test2 t1 = new Test2();              t1.Process();           }      }  }

这是代码执行时的内存分配图。

图片

这里我们从main函数调用两个函数Process();尽管它们都有相同的名称,但它们属于不同的类和Test1.Process处理字符串数据,而Test2.Process()处理StringBuilder数据。在分配图中,我们可以看到字符串处理函数消耗了Main()函数94%的资源,而Test2类中处理StringBuilder的Process()只消耗了Main()函数的0.21%的资源。

因此,结论是“当你想多次连接字符串时,总是使用StringBuilder”。

 

字符串格式化VS字符串连接

在第一点中,我展示了字符串如何比StringBuilder消耗更多的资源。在这一点上,我将比较格式化输出和字符串连接。在第一个函数中,我使用了一个格式规范来打印格式化的输出(基本上是连接一个字符串)。在另一个函数中,我使用(+)操作符连接一个字符串,如下所示:

  •  
  •  
  •  
using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using System.Diagnostics;  using System.IO;  using System.Net;  using System.Net.NetworkInformation;  using System.Threading;  using System.Globalization;  using System.Data.SqlClient;  namespace Test1  {      class Test      {          public void Format()          {              int a = 100;              Console.WriteLine("{0}AND{1}", a, a);          }          public void Concatination()          {              int a = 100;              Console.WriteLine(a + "AND" +a );          }      }       class Program      {          static void Main(string[] args)          {              Test t = new Test();              t.Format();              t.Concatination();              Console.ReadLine();          }      }  }

在内存分配中我们会看到:

图片

使用format打印字符串的函数消耗了57%的资源,而简单连接两个字符串的函数消耗了主函数的30%的资源。因此,我们可以清楚地看到,如果使用字符串连接而不是输出格式化,就可以节省系统资源。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值