2017-08-30 9 views
-2

いくつかのC#コードにどのような量のグローバル辞書を追加しようとしています。私はグローバルがC#では技術的に存在しないことを知っているので、名前空間のない静的クラスを使用しています。私はこれを実行すると、私はDictionary_Loadの復帰前、およびif文でDictionary_Lookupにブレークポイントを設定C#スコープの問題が「グローバル」クラス

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

:私のコードは、私のようなこのクラスを呼び出す別の形態では、この

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"; 
     } 
    } 
} 

のように見えます。 Dictionary_Loadの最後に辞書を見ると、辞書がいっぱいです。 MainFormに戻ると、辞書は空です。 Dictionary_Lookupのif文で壊れたとき、辞書も空です。 2つのクラスを同じ名前空間に入れてみましたが、うまくいきませんでした。スコープに問題がありますか?私はここで何かを見逃していますか?

+5

のようなあなたの機能を使用して 'Dictionary_Lookup'と' DictionaryLookup'は同じものではありません。 – mjwills

+2

また、 'ContainsKey'と' [] 'ではなく、' TryGetValue'を使用してください。 'Foo'との間で読み書きする**すべての**コードも含めてください。 – mjwills

+4

*実際に問題を再現し*、アンダーバーやコロンがないなどの明白なタイプミスがないプログラムを提供する。問題がなくなるか、どこにあるのかを教えてくれるか、誰かが助けることができるページに収まるようになるまで、プログラムを簡単かつ簡単にしてください。ヘルプについてはhttps://stackoverflow.com/help/mcveを参照してください。 –

答えて

0

アプリケーション用のグローバルオブジェクトが必要な場合は、シングルトンを使用します。

private static volatile MySingletonClass _instance; 

の変化、それに代えて、DictionaryLoad

public static class DictionaryLoad{ } 

として

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

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

名前あなたのクラス

_instance = new MySingletonClass(); 

使用

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

の代わりに

private static volatile Dictionary<string,string> _instance; 
この

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"; 
     } 
    }