Ich habe eine konst auf diese Weise erklärt:
const string DatabaseFilePath =
String.Format(System.Windows.Forms.Application.StartupPath + @"\Data Files\");
Das wird nicht kompiliert, so dass Sie nicht haben. Es wird nicht kompiliert, da der Ausdruck nicht konstant ist. Sie wissen vielleicht, dass das Ergebnis dieses Ausdrucks konstant ist (dh es ist egal, wie oft Sie String.Format
und System.Windows.Form.Application.StartupPath
aufrufen, aber der Compiler weiß das nicht! Außerdem gibt es keine Möglichkeit, dass StartupPath
seit seinem Wert konstant ist ist abhängig von der Laufzeit.) Sie fragen zu viel, dass der Compiler in der Lage ist, dies abzuleiten, wenn der Ausdruck tatsächlich eine Konstante ist.
Ich bin besorgt, dass die erste "string" und die zweite "String.Format", könnte einige Overhead hinzufügen.
Nehmen wir an, dass es kompiliert hat. Es konnte nur kompilieren, wenn der Compiler irgendwie feststellen konnte, dass der Ausdruck, den Sie DatabaseFilePath
zuweisen, konstant ist. Aber wenn es das kann, dann wurde DatabaseFilePath
's Wert zur Kompilierzeit aufgelöst. Daher wäre der einzige Overhead zur Kompilierungszeit. Zur Laufzeit würde es keine geben.
Wenn dies das Design, die Sie möchten, sollten Sie es wie erklären so
static readonly string DatabaseFilePath =
Path.Combine(System.Windows.Forms.Application.StartupPath, "Data Files");
aber Sie sollten einen Schritt darüber hinausgehen und sagen
class X {
private readonly string databaseFilePath;
public X(string databaseFilePath) {
this.databaseFilePath = databaseFilePath;
}
}
Dann woanders
X x = new X(
Path.Combine(System.Windows.Forms.Application.StartupPath, "Data Files")
);
Ich kenne den Namen Ihrer Klasse nicht, und ich habe die irrelevanten Details weggelassen, aber der Punkt ist klar.
Ich bin überrascht, dass sogar kompiliert. –
@Etienne: Es tut es nicht. – SLaks
Ihr 'String.Format'-Aufruf ist nutzlos und gefährlich. – SLaks