2017-06-10 4 views
0

En supposant que j'aurai besoin d'accéder aux valeurs contenues dans un fichier donné un petit nombre de fois, de différentes méthodes, je peux inclure une sorte de valeur booléenne dans une méthode pour déterminer s'il convient ou non d'appeler le fichier? Dire que j'ai le fichier config.cfg. Dans ce fichier, il y a trois valeurs:Conserver une valeur obtenue à partir du fichier dans la valeur de retour d'une méthode

string/name>max| 
bool/adult>yes| 
int/age>20| 

La méthode getUserName() retourne la valeur de "max". Elle le fait en appelant le fichier:

using (StreamReader reader = new StreamReader(path)) 
{ 
    //get line beginning with string/name here 
    return //string value containing name 
} 

Supposons que je dois utiliser la valeur de name à plusieurs reprises, ainsi que les valeurs isAdult et clientAge. Plutôt que d'accéder au fichier encore et encore, il pourrait être beaucoup plus facile d'enregistrer la valeur demandée dans une forme de variable statique. Cependant, cette variable doit encore être modifiée en valeur au moins une fois, lorsque la méthode est appelée pour la première fois.

Puis-je faire cela à l'intérieur la méthode getUserName()?
En outre, cette idée est-elle même possible dans les limites de la POO? Est-ce un concept similaire à Prefetch?

+0

Vous pouvez créer une classe singleton qui analyse le fichier et dont les valeurs sont des propriétés. La première fois que vous accéderez à la classe, elle chargera le fichier et, à l'avenir, l'accès sera en mémoire. – juharr

+0

pourquoi pas un statique, et le définir avec une valeur initiale nulle. Simple, propre, et malgré ce que les puristes disent que c'est une bonne intention (en fait une intention spécifique de la définition du langage C#) d'utiliser des variables statiques. – Rob

+0

@Rob car cela nécessite un objet supplémentaire dans la classe. J'essaie de tout faire à l'intérieur de la méthode unique, au besoin, plutôt que de créer une valeur distincte pour 'Name'. Cela signifie que si j'exécute une fonction qui ne nécessite pas certaines des données contenues dans le fichier, je n'ai pas besoin d'y accéder. Pour info, je cible les plateformes embarquées ici, d'où la nécessité de rationaliser. –

Répondre

0

Il me semble vraiment que vous devez accéder à un champ d'une manière paresseuse (c'est-à-dire seulement si nécessaire, si nécessaire). Si oui .NET a de la classe Lazy pour de tels cas, qui fournit également la sécurité de fil hors de la boîte:

public static Lazy<string> Name { get; } = new Lazy<string>(() => ReadNameFromFile()); 

Lazy veillera également à ce que vous créez seule valeur une fois (par exemple appeler la méthode initiailization) et sur les appels plus tard, il sera tout simplement renvoie la valeur déjà récupérée.

0

Créez une classe statique. Quelque chose comme ceci:

public static class ClientConfig{ 

    public static string Name{get;set;} 
    public static bool IsAdult{get;set;} 
    public static int Age{get;set;} 

    public static void Load(){ 
    // load your values 
    // ClientConfig.Name = name from file etc. 
    } 


    public static void Save(string newName, int age, bool value){ 
    // save your values to the config file 
    } 
    } 

Et appelez ClientConfig.Load() première fois au démarrage de votre application, par exemple (ou chaque fois que vous avez besoin de récupérer des données de configuration)

+0

Pouvez-vous développer comment cela fonctionne? Comment la fonctionnalité get/set s'applique-t-elle ici? –

+0

Ceci est OOP de base. Name, IsAdult et Age sont des propriétés de classe (dans cet exemple elles sont statiques). S'il vous plaît en savoir plus sur [propriétés de classe ici] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/using-properties) et ce qui est [statique] (https : //docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/static) – DolceVita