避免'const'声明中的开销

时间:2010-11-24 17:57:08

标签: c#

我已经用这种方式声明了 const

const string DatabaseFilePath = 
String.Format(System.Windows.Forms.Application.StartupPath + @"\Data Files\");

我担心第一个“字符串”和第二个“String.Format”可能会增加一些开销。如果是真的,建议一个更好的方法来写这个。

3 个答案:

答案 0 :(得分:6)

  

我以这种方式声明了一个const:

不,你没有。除非你使用其他语言(不是C#),否则甚至不会编译。

你可能意味着一个只读字段:

private readonly string DatabaseFilePath = 
    Path.Combine(Application.StartupPath, "Data Files");

另请注意使用Path.Combine而不是string.Format。

答案 1 :(得分:5)

您的声明是编译错误 const个字段必须是编译时常量;他们无法进行方法调用。

相反,您需要制作static readonly字段。

此外,您应该使用Path.Combine组合路径字符串,这将正确处理\

将其更改为

static readonly string DatabaseFilePath = Path.Combine(Application.StartupPath, @"Data Files\");

答案 2 :(得分:0)

  

我以这种方式声明了一个const:

const string DatabaseFilePath = 
String.Format(System.Windows.Forms.Application.StartupPath + @"\Data Files\");

那不会编译,所以你没有。它不会编译,因为表达式不是常量。您可能知道该表达式的结果是常量(即,无论您调用String.FormatSystem.Windows.Form.Application.StartupPath多少次都是相同的,但编译器不知道这一点!此外,没有StartupPath由于其值依赖于运行时而保持不变的可能性。)在要求表达式实际为常量的情况下,编译器能够推断出这种情况的过多。

  

我担心第一个“字符串”和第二个“String.Format”可能会增加一些开销。

让我们假设它确实编译了。如果编译器能够以某种方式神奇地确定您分配给DatabaseFilePath的表达式是不变的,那么它只能编译。但如果能够做到这一点,那么DatabaseFilePath的值已在编译时得到解决。因此,唯一的开销是在编译时。在运行时没有任何内容。

如果这是您想要的设计,您应该如此声明

static readonly string DatabaseFilePath =
Path.Combine(System.Windows.Forms.Application.StartupPath, "Data Files");

但你应该超越一步并说出

class X {
    private readonly string databaseFilePath;
    public X(string databaseFilePath) {
        this.databaseFilePath = databaseFilePath;
    }
}

然后在其他地方

X x = new X(
    Path.Combine(System.Windows.Forms.Application.StartupPath, "Data Files")
);

我不知道你班级的名字,我已经省略了不相关的细节,但重点很明确。