2017-08-30 2 views
-2

J'essaie d'ajouter ce qui équivaudrait à un dictionnaire global à un code C#. Je sais que les globals n'existent pas techniquement en C#, donc j'utilise une classe statique sans espace de noms. Mon code ressemble à ceciC# Problème d'étendue avec la classe "global"

public static class GlobalClass 
{ 
    public static Dictionary<string,string> Foo = new Dictionary<string,string>(); 
    public static void Dictionary_Load() 
    { 
     //Load Dictionary from database. 
     // When I break at the end of this function I see the Dictionary has data in it. 
    } 

    public static string Dictionary_Lookup(input) 
    { 
     if(Foo.ContainsKey(input)) 
     { 
      string return_string = Foo[input]; 
      return return_string; 
     }else 
     { 
      return "ERROR"; 
     } 
    } 
} 

Dans une autre forme que j'appelle cette classe en tant que tel:

namespace MainFormNamespace 
{ 
    public partial class : MainForm : Form 
    { 
     .... 
    DictionaryLoad(); 
    string test = DictionaryLookup("Bar") //I know "Bar" is in the dictionary 
    ..... 
    } 
} 

Quand je lance ce que je mets un point d'arrêt avant le retour de Dictionary_Load et à l'instruction if Dictionary_Lookup . Quand je regarde le dictionnaire à la fin de Dictionary_Load, il est plein. Quand je retourne à MainForm, le dictionnaire est vide. Lorsque je casse à l'instruction if dans Dictionary_Lookup, le dictionnaire est également vide. J'ai essayé de mettre les deux classes dans le même espace de noms, et cela n'a pas fonctionné. Y a-t-il quelque chose qui ne va pas dans ma portée? Est-ce que je manque quelque chose d'évident ici?

+5

'' Dictionary_Lookup' et DictionaryLookup' ne sont pas la même chose. – mjwills

+2

Utilisez également 'TryGetValue' plutôt que' ContainsKey' et '[]'. Veuillez également inclure ** tout ** code qui lit ou écrit à 'Foo'. – mjwills

+4

Fournissez un programme qui * reproduit réellement le problème * et qui ne comporte pas de fautes de frappe évidentes comme des barres de soulignement et des points-virgules manquants. Rendez votre programme plus simple et plus simple jusqu'à ce que le problème disparaisse - ce qui devrait vous dire où il se trouvait - ou si vous avez quelque chose qui correspond à une page que quelqu'un peut vous aider. Voir https://stackoverflow.com/help/mcve pour obtenir de l'aide. –

Répondre

0

Si vous voulez un objet global pour l'application, utilisez un singleton.

https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Design-Patterns-Singleton

https://github.com/skimedic/presentations/blob/master/Patterns/Creational/Singleton/MySingletonClass.cs

Nom de votre classe comme DictionaryLoad

public static class DictionaryLoad{ } 

Au lieu de

private static volatile MySingletonClass _instance; 

changement à

private static volatile Dictionary<string,string> _instance; 

Au lieu de

_instance = new MySingletonClass(); 

utilisation

_instance = new Dictionary<string, string>() and load the dictionary. 

Utilisez votre fonction comme celui-ci

public static string Dictionary_Lookup(input) 
    { //DictionaryLoad.Instance will return the dictionary now. 

     if(DictionaryLoad.Instance.ContainsKey(input)) 
     { 
      string return_string = DictionaryLoad.Instance[input]; 
      return return_string; 
     }else 
     { 
      return "ERROR"; 
     } 
    }