web-dev-qa-db-fra.com

Chaîne publique const?

Est-il possible d’utiliser une classe comme celle-ci (spécifique à la conception/aux directives)? J'utilise MVVM Pattern.

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

Il existe des différences significatives entre const et public static readonly, et vous devez choisir laquelle utiliser avec précaution:

(Par "client", je veux dire "code dans une assemblée différente faisant référence au membre.)

  • Si vous modifiez la valeur sans recompiler les clients, ils continueront d'utiliser la valeur d'origine si vous utilisez const. Avec public static readonly, ils verront la valeur mise à jour. De toute façon, si vous recompilez tous les clients, ce n'est pas un problème.
  • Seule la forme const est une constante de temps de compilation, ce qui signifie qu’elle peut être utilisée dans:
    • Arguments d'attributs
    • Changer de relevé
    • Déclarations de paramètres facultatifs

Si vous êtes heureux de recompiler tous vos clients si vous modifiez jamais la valeur, les avantages du deuxième point pointent vers l'utilisation de const.

Bien sûr, je me demande si Pages vraiment doit être publique de toute façon ... cela ressemble à quelque chose qui pourrait être internal, avec internal membres - à quel point les inconvénients de const disparaissent complètement.

33
Jon Skeet

Guide général d'utilisation de const pour la définition de valeurs constantes. Si ces constantes doivent être accessibles en dehors de l'assemblage? Si non, alors le déclarer comme 

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

Du point de vue de la conception de votre question, il semble que l’utilisation d’un seul objet statique pour contenir toutes les références de page puisse être compliquée. Ne pouvez-vous pas simplement le stocker dans l'objet de page réel?

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

    ... other stuff ...
}

puis appelez-le sur les lignes de ...

goTo(view2.PageName);
3
flacnut

Je pense que c'est l'une des meilleures choses que vous puissiez faire. Quelques suggestions supplémentaires: avec des chaînes, il est parfaitement correct d'utiliser consts. Si vous souhaitez utiliser différents types, utilisez static readonly, puis initialisez-le dans un constructeur static

Pour une approche différente en utilisant des énumérations, voir ce fil de discussion . Puisque ce que vous essayez de faire ressemble beaucoup à une enum de chaîne, cela pourrait être la voie à suivre pour vous. 

Et n'oubliez pas que tant que vous spécifiez vos pages dans le code, apporter des modifications (par exemple, renommer ou déplacer une page) sera une tâche ardue. Pensez à utiliser quelque chose comme des ressources ou des sitemaps. (Dans le cas où vous seulement utilisez la classe pour une liste de pages, je voudrais utiliser des C #fortement typés ressources- ils se comporteront de la même manière comme votre classe et vous n'aurez pas à les coder à la main.)

0
ver