C#字符串连接最佳实践

时间:2017-06-28 09:53:17

标签: c# string concatenation stringbuilder conventions

我在google搜索最佳c#字符串连接,我在microsoft c#代码约定中找到了这个: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions

  

使用+运算符连接短字符串,如下面的代码所示:

string displayName = nameList[n].LastName + ", " + nameList[n].FirstName;

但我更喜欢(String.Format)“$”以获得更多可读性恕我直言:

string firstName = "MyName";
string lastName = "MyLastName";
string displayName = $"{lastName}, {firstName}";
Console.WriteLine(displayName); // "MyLastName, MyName"

你能告诉我你觉得哪一个更好吗?或仅仅是个人偏好?

谢谢!

3 个答案:

答案 0 :(得分:2)

使用StringBuilder获得最佳效果。 String.Format也很好,但不能完全取代字符串上的“+”运算符。

StringBuilder builder = new StringBuilder();
// Append to StringBuilder.
for (int i = 0; i < 10; i++)
{
    builder.Append(i).Append(" ");
}
Console.WriteLine(builder);

请记住导入名称空间:

using System.Text;

答案 1 :(得分:1)

如果性能是关键字符串连接更好,因为它总是胜过构建字符串的其他方法
但是,与String.Format相比,字符串连接占用更多内存所以连接字符串的最佳方法是使用String.FormatSystem.Text.StringBuilder对象

答案 2 :(得分:1)

这已经超过一年了,但是在Google的搜索结果中排名最高。最初我是这样做的:

StringBuilder builder = new StringBuilder();
// Append to StringBuilder.
for (int i = 0; i < 10; i++)
{
    builder.Append(i + " ");
}
Console.WriteLine(builder);

然后,我认为这可能已经超出了使用StringBuilder的地步。我开始这样做

StringBuilder builder = new StringBuilder();
// Append to StringBuilder.
for (int i = 0; i < 10; i++)
{
    builder.Append(i);
    builder.Append(" ");
}
Console.WriteLine(builder);

最后,我意识到我可以像@Habeeb这样将方法链接起来。我想知道是否有任何性能上的好处。

$e1 = [Text.StringBuilder]::new()
$e2 = [Text.StringBuilder]::new()

function ef1(){
   Write-Host "Start Date:" (Get-Date)
   for($i=0;$i -lt 100000;$i++){
      $e1.Append("Hello") | Out-Null
      $e1.AppendLine($i.ToString()) | Out-Null
      $e1.Append("World") | Out-Null
      $e1.AppendLine($i.ToString()) | Out-Null
      $e1.Append("More Lines") | Out-Null
      $e1.AppendLine($i.ToString()) | Out-Null
   }
}

function ef2(){
   Write-Host "Start Date:" (Get-Date)
   for($i=0;$i -lt 100000;$i++){
$e1.Append("Hello").AppendLine($i.ToString()).Append("World").AppendLine($i.ToString()).Append("More Lines").AppendLine($i.ToString()) | Out-Null
   }
   Write-Host "End Date:" (Get-Date)
}

这是一个粗略的比较,我知道它在PS中。但是,ef1导致17秒,ef2导致3秒(此处不考虑毫秒)。除非我没有记错,否则链接方法会疯狂地提高性能。 (是的,这可能不是StringBuilder独有的,但是StringBuilder促使我提出了这个问题。)

更新:

由于@ cogumel0,我现在意识到Out-Null有多昂贵。将迭代次数增加一位数字会显示ef1大约需要4秒,而ef2大约需要1秒。 (我还为ef1添加了丢失的写结束日期。)

$e1 = [Text.StringBuilder]::new()
$e2 = [Text.StringBuilder]::new()

function ef1(){
   Write-Host "Start Date:" (Get-Date)
   for($i=0;$i -lt 1000000;$i++){
      [void] $e1.Append("Hello")
      [void] $e1.AppendLine($i.ToString())
      [void] $e1.Append("World")
      [void] $e1.AppendLine($i.ToString())
      [void] $e1.Append("More Lines")
      [void] $e1.AppendLine($i.ToString())
   }
   Write-Host "Start Date:" (Get-Date)
}

function ef2(){
   Write-Host "Start Date:" (Get-Date)
   for($i=0;$i -lt 1000000;$i++){
[void] $e1.Append("Hello").AppendLine($i.ToString()).Append("World").AppendLine($i.ToString()).Append("More Lines").AppendLine($i.ToString())
   }
   Write-Host "End Date:" (Get-Date)
}