我有一个包含3个方法的类,每个方法都启动一个新的System.Diagnostics.Process
,在其中传递一些唯一的参数以及所有3个参数所共享的一些标准参数。
为了减少重复,我目前将所有一致的参数存储为类级常量,然后在方法运行时对其进行插值。
private const string File = "file.exe";
private const string StandardAgs = "--whatever";
public void DoA()
{
string command = $"{File} unique args for A {StandardAgs}";
Process.Start(command);
}
public void DoB()
{
string command = $"{File} unique args for B {StandardAgs}";
Process.Start(command);
}
public void DoC()
{
string command = $"{File} unique args for C {StandardAgs}";
Process.Start(command);
}
此插值是否有运行时处理开销?还是因为所有类级变量都是常量,编译器是否会认识到可以在编译时进行插值?
如果不这样做,我是否需要使所有字符串保持不变以实现零运行时插值,像这样?
private const string File = "file.exe";
private const string StandardAgs = "--whatever";
private const string Acommand = $"{File} unique args for A {StandardAgs}";
private const string Bcommand = $"{File} unique args for B {StandardAgs}";
private const string Ccommand = $"{File} unique args for C {StandardAgs}";
public void DoA()
{
Process.Start(Acommand);
}
public void DoB()
{
Process.Start(Bcommand);
}
public void DoC()
{
Process.Start(Ccommand);
}
我认识到,只有第二个示例将字符串静态地存储在内存中,而不是基于每个实例,但是我不关心内存占用,只关心在运行时发生多少字符串插值。
答案 0 :(得分:2)
我写了一个简短的程序,然后通过ILSpy运行它。
c#:
const string Foo = "Hello";
static void Main()
{
var bar = $"{Foo}Bar!";
Console.WriteLine(bar);
}
IL:
IL_0001: ldstr "{0}Bar!"
IL_0006: ldstr "Hello"
IL_000b: call string [mscorlib]System.String::Format(string, object)
IL_0010: stloc.0
IL_0011: ldloc.0
IL_0012: call void [mscorlib]System.Console::WriteLine(string)
看起来它变成了字符串。Format调用并在运行时进行计算。
是的,对性能的影响非常小。