2010-11-24 3 views
1

ich eine const auf diese Weise erklärt haben:Kopf Vermeidung in einer ‚const‘ Erklärung

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

Ich bin besorgt, dass die erste „string“ und die zweite „String.Format“ und fügte hinzu, könnte einige Overhead. Wenn es wahr ist, schlagen Sie eine bessere Möglichkeit vor, dies zu schreiben.

+0

Ich bin überrascht, dass sogar kompiliert. –

+0

@Etienne: Es tut es nicht. – SLaks

+2

Ihr 'String.Format'-Aufruf ist nutzlos und gefährlich. – SLaks

Antwort

5

Ihre Deklaration ist ein Compilerfehler.
const Felder müssen Kompilierzeit Konstanten sein; sie kann nicht Methodenaufrufe haben.

Stattdessen müssen Sie static readonly Feld machen.

Auch sollten Sie Pfade Zeichenfolgen mit Path.Combine kombinieren, die die \ korrekt behandelt werden.

ändern es zu

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

Oh. Ich schaute nur auf die roten Linien. – RKh

+1

+1 für Path.Combine. –

+0

Wenn die zweite Zeichenfolge kein Ordner, sondern eine Datei ist, funktioniert sie? – RKh

6

Ich habe ein const auf diese Weise erklärt:

Nein, Sie haben nicht. Dies wird nicht einmal kompiliert, es sei denn, Sie verwenden eine andere Sprache (nicht C#).

Sie meinen wahrscheinlich ein Nur-Lese-Feld:

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

Beachten Sie auch die Verwendung von Path.Combine statt string.Format.

+0

+1, Technisch kann das OP es auf diese Weise deklarieren, es wird nur nicht kompilieren;) – JaredPar

+0

Das Entfernen der nachfolgenden \ kann eine brechende Änderung sein. – SLaks

+0

@SLaks, ja absolut, wenn Sie string.Format verwenden. Deshalb wird 'Path.Combine' bevorzugt. Um eine Datei noch einmal hinzuzufügen, sollte 'Path.Combine' verwendet werden. –

0

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.