我已经用这种方式声明了 const :
const string DatabaseFilePath =
String.Format(System.Windows.Forms.Application.StartupPath + @"\Data Files\");
我担心第一个“字符串”和第二个“String.Format”可能会增加一些开销。如果是真的,建议一个更好的方法来写这个。
答案 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.Format
和System.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")
);
我不知道你班级的名字,我已经省略了不相关的细节,但重点很明确。