2010-01-21 5 views
4

j'ai une classe ci-dessous:C# Const dans une classe publique

Je veux accéder à ces chaînes par défaut, mais le compilateur C# n'aime pas la combinaison Const pour créer une Const.

public class cGlobals 
{ 
    // Some Default Values 

    public class Client 
    { 
     public const string DatabaseSDF = "database.sdf"; 
     public const string DatabaseDir = "database"; 
     public const string DatabaseFullLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), 
                 DatabaseDir); 
     public const string DataSource = Path.Combine(DatabaseDir, DatabaseSDF); 
    } 
} 

Y a-t-il une meilleure façon de coder les chaînes? Je veux utiliser les dossiers spéciaux et Path.Combine.

Merci

+0

Je voudrais remercier tout le monde pour leurs réponses, chaîne de caractères publique statique a résolu ce problème. J'utilise aussi AppSettings donc je veux vraiment accepter la réponse de tout le monde ici? – Belliez

Répondre

8

Vous devez utiliser static readonly au lieu de const, car const doit être une constante au moment de la compilation.

De plus, les constantes seront réellement compilées dans les assemblées qui les utilisent, donc si vous faites référence à ces champs d'autres assemblages, vous devrez les recompiler si vous avez modifié les constantes. Cela ne se produit pas avec les champs static readonly. Donc de toute façon, c'est une meilleure idée :)

J'ai effectivement demandé à ce sujet il y a quelque temps et je vous recommande de le lire et la réponse acceptée: static readonly vs const.

3

Vous pouvez utiliser readonly au lieu de const. Vous pouvez également utiliser app.config pour stocker vos paramètres de configuration.

4

Pour qu'une variable soit déclarée const, la valeur affectée doit être une constante de compilation ; d'utiliser le résultat d'une méthode que vous appelez besoin de changer votre déclaration de variable:

public static readonly string DataSource = ...; 

Si vous pensez à ce sujet, ce n'est pas une constante de compilation, en ce qu'elle donnera des résultats différents en fonction de quel système d'exploitation vous exécutez. Il est constant dans une seule exécution mais pas une constante "générale".

2

Je crains que vous devrez utiliser

static public readonly string DatabaseFullLocation = Path.Combine(/* ... */); 

à la place;

2

Personnellement, je ne coderais pas du tout les chaînes.

Je les mettrais dans appSettings.

Pourquoi? Eh bien, si vous avez besoin de changer ces valeurs, vous devrez recompiler votre code. Les mettre en appSettings vous permettra de simplement changer votre fichier de configuration.

Vous pouvez toujours fournir un accesseur via votre classe.

public string DatabaseSDF 
{ 
    get 
    { 
    return System.Configuration.ConfigurationManager.AppSettings["DatabaseSDF"]; 
    } 
} 

Le meilleur des deux mondes, imo.

+1

Je le fais déjà, mais je cherche à spécifier des chaînes par défaut pour la première fois que l'application fonctionne. L'utilisation de la chaîne readonly publique statique a résolu mon problème. – Belliez

1

types const doivent être identifiés au moment de la compilation, dans votre code que vous essayez d'appeler Path.Combine à d'exécution pour déterminer le chemin réel.Et vous ne pouvez pas mettre à jour const à runtime.

0

Dans les paramètres d'application, vous pouvez conserver ce type de constantes.

Dans les propriétés du projet, sélectionnez l'onglet Paramètres. Dans la grille, vous pouvez définir vos constantes.

Vous pouvez obtenir aussi bien que définir ces variables même pendant l'exécution.

Message.show(My.Settings.YourVariable); //you will get the value 

et fixé par

My.Settings.YourVariable="Vibin"; 
    My.Settings.Save() 

Je pense que c'est l'un de la meilleure façon.

+0

merci, c'est ce que je fais. Je voulais définir les valeurs par défaut comme consts d'où la question. – Belliez

0
  1. Définir une classe permet de dire GetDirectory.
  2. Rendre toutes les méthodes statiques.
  3. Définissez une classe pour les constantes. delcate toutes les variables -> string readonly public static Name_Of_Var = "Toute valeur"

  4. De méthodes getDirectory - Définir le code pour le dossier dont vous avez besoin pour accéder Ex: Path.Combine (GetFolderPath (Environment.SpecialFolder ". Sélectionnez le nom du dossier "), nom des constantes)

Terminé.

4

Juste pour ajouter aux autres bonnes réponses: une constante devrait logiquement être quelque chose qui est immuable pour tous les temps et tous les lieux. Des choses comme le nombre d'oeufs dans une douzaine, le nombre atomique de plomb, et ainsi de suite. Les valeurs qui changent au fil du temps, comme le nombre de pays de l'Union européenne ou le prix d'une once troy d'or en dollars australiens, ne doivent pas être modélisées comme des constantes.

Dans votre cas, la valeur n'est pas constante d'un point de vue logique pour tous les temps et tous les lieux. N'essayez donc pas d'utiliser une constante.

+0

Oui, je suis d'accord, merci. – Belliez

Questions connexes