字符串插值是否评估重复使用?

Nat*_*lus 25 c# c#-6.0

如果我有一个格式字符串多次使用相同的占位符,例如:

emailBody = $"Good morning {person.GetFullName()}, blah blah blah, {person.GetFullName()} would you like to play a game?";
Run Code Online (Sandbox Code Playgroud)

会person.GetFullName()被评估两次,还是编译器足够聪明,知道它们是相同的值,应该评估一次?

Jon*_*eet 38

是的,它将被评估两次.它不可能知道它是相同的值.例如:

Random rng = new Random();
Console.WriteLine($"{rng.Next(5)}, {rng.Next(5)}, {rng.Next(5)}");
Run Code Online (Sandbox Code Playgroud)

它就像你刚用表达式作为方法参数一样 - 如果你调用了:

Console.WriteLine("{0} {1}", person.GetFullName(), person.GetFullName());
Run Code Online (Sandbox Code Playgroud)

...你希望GetFullName被叫两次,不是吗?

如果您只想评估一次,请事先这样做:

var name = person.GetFullName();
emailBody = $"Good morning {name}, blah blah blah, {name} would you like to play a game?";
Run Code Online (Sandbox Code Playgroud)

或者只是使用普通string.Format电话:

emailBody = string.Format(
    "Good morning {0}, blah blah blah, {0} would you like to play a game?",
    person.GetFullName());
Run Code Online (Sandbox Code Playgroud)

  • @hexafraction,是的,它可以.只要你无法观察到差异,它就可以随心所欲地逃脱.虽然注意到在一般情况下,确定函数是否纯粹等于停止问题. (3认同)
  • 如果编译器可以证明被调用的函数是纯函数,那么编译器是否可以执行此优化? (2认同)
  • @hexafraction C#不具有"as-if"规则吗?如果不改变结果,则应允许任何优化. (2认同)

Ser*_*rvy 12

是编译器足够智能,知道这些是相同的值[...]?

但它不会不一定是相同的值.该方法可以很好地在后续调用中返回不同的结果,因此无法缓存结果.