webentwicklung-frage-antwort-db.com.de

Öffentliche Konstante?

Ist es in Ordnung, eine Klasse wie diese zu verwenden (design-/richtlinienspezifisch)? Ich verwende MVVM Pattern.

public static class Pages
{
    public const string Home = "Home.xaml";
    public const string View2 = "View2.xaml";
    /* a few more... */
}
20
SBoss

Es gibt erhebliche Unterschiede zwischen const und public static readonly, und Sie sollten überlegen, welche Option Sie mit Vorsicht verwenden sollten:

(Unter "Client" ist hier der Code in einer anderen Assembly zu verstehen, der sich auf das Mitglied bezieht.)

  • Wenn Sie den Wert ändern, die Clients jedoch nicht neu kompilieren, verwenden sie weiterhin den ursprünglichen Wert, wenn Sie const verwenden. Mit public static readonly wird der aktualisierte Wert angezeigt. Wenn Sie alle Clients trotzdem neu kompilieren, ist dies kein Problem.
  • Nur die const-Form ist eine Kompilierungszeitkonstante, was bedeutet, dass sie verwendet werden kann in:
    • Attributargumente
    • Anweisungen wechseln
    • Optionale Parameterdeklarationen

Wenn Sie alle Ihre Kunden neu kompilieren, wenn Sie den Wert jemals ändern, weisen die Vorteile des zweiten Aufzählungspunkts auf die Verwendung von const hin.

Natürlich frage ich mich, ob Pages wirklich sowieso öffentlich sein muss ... es klingt wie etwas, das internal mit internal-Mitgliedern sein könnte - an diesem Punkt gehen die Nachteile von const vollständig weg.

33
Jon Skeet

Eine allgemeine Richtlinie, wenn Sie const zum Definieren konstanter Werte verwenden. Ob diese Konstanten außerhalb der Montage zugänglich sind? Wenn nicht, dann erklären Sie es als 

internal static class Pages
{
    public const string Home = "Home.xaml";
    public const string View2 = "View2.xaml";
    /* a few more... */
}
3
AksharRoop

Aus der Gestaltungsperspektive Ihrer Frage scheint es, als könnte es schnell unangenehm werden, wenn ein einziges statisches Objekt alle Seitenverweise enthält. Können Sie es nicht einfach im eigentlichen Seitenobjekt speichern?

class view2 {
    public const string PageName = "View2.xaml";

    ... other stuff ...
}

dann nennen Sie es entlang der Zeilen von ...

goTo(view2.PageName);
3
flacnut

Ich denke, das ist eines der besten Dinge, die Sie tun können. Einige weitere Vorschläge: mit Strings ist die Verwendung von consts durchaus in Ordnung. Falls Sie andere Typen verwenden möchten, verwenden Sie static readonly und initialisieren Sie sie anschließend in einem static-Konstruktor. 

Für einen anderen Ansatz, der enums verwendet, siehe diesen Thread . Da das, was Sie versuchen, sehr nach einem String-Enum aussieht, könnte dies der richtige Weg für Sie sein. 

Vergessen Sie nicht, dass das Ändern von Seiten (z. B. Umbenennen oder Verschieben einer Seite), solange Sie Ihre Seiten im Code angeben, sehr schmerzhaft ist. Erwägen Sie die Verwendung von Ressourcen oder Sitemaps. (Wenn Sie nur die Klasse für eine Seitenliste verwenden, würde ich mit C #s stark typisierten resources gehen) - sie werden sich genauso verhalten als Ihre Klasse, und Sie müssen sie nicht manuell codieren.)

0
ver