我有这样的代码:
int i = 1;
string dynemicString = $"i = {i}";
while(i<10)
{
Console.WriteLine(i);
i++;
}
我希望得到这样的结果:
i = 1
i = 2
i = 3
...
怎么做?
答案 0 :(得分:4)
int i = 1;
while(i<10)
{
Console.WriteLine($"i = {i}");
i++;
}
有关更多信息,请参阅String Interpolation
如果您想要更加标记化的方法,请使用String.Format
int i = 1;
string dynemicString = "i = {0}";
while(i<10)
{
Console.WriteLine(string.Format(dynemicString,i));
i++;
}
答案 1 :(得分:2)
这是TheGeneral答案的替代方法。我并不是建议使用它,但我发现这只是一个“有趣”的想法,只是为了更多地了解字符串插值的工作原理。
当插值的字符串文字转换为string
时,会立即评估所有表达式并格式化字符串。之后字符串不能改变。
当插值字符串文字转换为FormattableString
时,将计算表达式,但不执行字符串格式设置。而是存储所有表达式的结果以供稍后格式化。每次在ToString
上致电FormattableString
时,都会再次执行格式化。
因此,我们可以通过使相同的值(最初评估)在字符串格式化时返回不同的字符串来使其动态化。一个简单但非常难看的方法是使用委托捕获i
,然后将委托放在一个覆盖ToString
的包装器中,并每次执行委托。这是一个完整的例子:
// CODE FOR EDUCATIONAL PURPOSES ONLY. DON'T USE IN PRODUCTION!
using System;
public class FuncWrapper
{
private readonly Func<string> func;
public FuncWrapper(Func<string> func) =>
this.func = func;
public override string ToString() => func();
}
class Test
{
static void Main()
{
int i = 1;
// Capture i in a delegate; each time the delegate
// is executed, you'll get a different value. Each
// time ToString is called, the delegate will be called
var wrapper = new FuncWrapper(() => i.ToString());
FormattableString dynamicString = $"i = {wrapper}";
while (i < 10)
{
Console.WriteLine(dynamicString);
i++;
}
}
}
输出:
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9