使用插值字符串连接" +" C#中的运算符

时间:2017-02-21 14:51:46

标签: c# string

在可读性方面,我看到使用插值字符串的好处:

string myString = $"Hello { person.FirstName } { person.LastName }!"

以这种方式完成连接:

string myString = "Hello " + person.FirstName + " " person.LastName + "!";

this video tutorial的作者声称第一个更好地利用了记忆。

怎么回事?

5 个答案:

答案 0 :(得分:9)

Here is benchmarks. 字符串连接对于极少数的参数来说要快一些,但需要更多内存。在20多个参数之后,concat在时间和记忆方面更好。

答案 1 :(得分:7)

作者实际上并没有说人们比其他人更好地利用内存。它说抽象中的一种方法“充分利用了记忆”,这本身并不是真正意义上的任何东西。

但不管他们说了什么,这两种方法在实施上都没有明显的不同。在记忆或时间方面,它们都不会与另一个有意义地不同。

答案 2 :(得分:2)

字符串是不可变的。这意味着他们无法改变。

当您使用+符号连接字符串时,最终会创建多个字符串以获取最终字符串。

当您使用插值方法(或StringBuilder)时,.NET运行时会优化您的字符串使用,因此(理论上)它具有更好的内存使用率。

所有这一切,通常取决于你在做什么,以及你是如何做到的。

一组连接不能提供很多性能/内存改进。

在循环中进行这些连接可以有很大的改进。

答案 3 :(得分:2)

我做了一个简单的测试,请参见下文。如果连接常量,请不要使用“ string.Concat”,因为编译器无法在编译时将字符串连接在一起。如果使用变量,结果实际上是相同的。

时间测量结果:

const string interpolation : 4
const string concatenation : 58
const string addition      : 3
var string interpolation   : 53
var string concatenation   : 55
var string addition        : 55
mixed string interpolation : 47
mixed string concatenation : 53
mixed string addition      : 42

代码:

void Main()
{

const int repetitions = 1000000; 
const string part1 = "Part 1"; 
const string part2 = "Part 2"; 
const string part3 = "Part 3"; 
var vPart1 = GetPart(1); 
var vPart2 = GetPart(2); 
var vPart3 = GetPart(3); 

Test("const string interpolation ", () => $"{part1}{part2}{part3}"); 
Test("const string concatenation ", () => string.Concat(part1, part2, part3)); 
Test("const string addition      ", () => part1 + part2 + part3); 
Test("var string interpolation   ", () => $"{vPart1}{vPart2}{vPart3}"); 
Test("var string concatenation   ", () => string.Concat(vPart1, vPart2, vPart3)); 
Test("var string addition        ", () => vPart1 + vPart2 + vPart3); 
Test("mixed string interpolation ", () => $"{vPart1}{part2}{part3}");
Test("mixed string concatenation ", () => string.Concat(vPart1, part2, part3));
Test("mixed string addition      ", () => vPart1 + part2 + part3);

void Test(string info, Func<string> action) 
{ 
    var watch = Stopwatch.StartNew(); 
    for (var i = 0; i < repetitions; i++) 
    { 
        action(); 
    } 
    watch.Stop(); 
    Trace.WriteLine($"{info}: {watch.ElapsedMilliseconds}"); 
} 

string GetPart(int index) 
    => $"Part{index}"; 

}

答案 4 :(得分:1)

因为c#中的字符串是不可变的,这就是为什么一次又一次地使用相同的内存所以它不会对内存产生太大影响,但就性能而言,实际上是在区分String.FormatString.Concat因为在编译时你的代码就像这样

  string a = "abc";
  string b = "def";

  string.Format("Hello {0} {1}!", a, b);

  string.Concat(new string[] { "Hello ", a, " ", b, "!" });

如果您对String output: format or concat in C#

感兴趣,可以在这两者之间找到关于性能的完整主题