2017-08-30 100 views
-2

我想添加什麼將相當於一個C#代碼的全局字典。我知道全局變量在技術上並不存在於C#中,所以我使用了一個沒有名稱空間的靜態類。我的代碼看起來像這樣C#範圍問題與「全球」類

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

在另一種形式我調用這個類是這樣:

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

當我運行此我Dictionary_Load返回前設置斷點,並在Dictionary_Lookup if語句。當我查看Dictionary_Load末尾的字典時,它已滿。當我返回到MainForm時,字典是空的。當我在Dictionary_Lookup中的if語句中斷時,字典也是空的。我試着把這兩個類放在同一個命名空間中,但這並不起作用。我的範圍有問題嗎?我在這裏錯過了很明顯的東西嗎

+5

'Dictionary_Lookup'和'DictionaryLookup'是不一樣的東西。 – mjwills

+2

另外,使用'TryGetValue'而不是'ContainsKey'和'[]'。還請包括所有讀取或寫入'Foo'的**代碼。 – mjwills

+4

提供一個*實際上重現問題的程序*,並且沒有明顯的錯別字,如缺少下劃線和額外的冒號。讓你的程序變得更簡單更簡單,直到問題消失 - 這應該告訴你它在哪裏 - 或者你有什麼東西可以放到某個人可以幫助你的頁面上。請參閱https://stackoverflow.com/help/mcve尋求幫助。 –

回答

0

如果您想爲應用程序使用全局對象,請使用單例。

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

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

名稱類的DictionaryLoad

public static class DictionaryLoad{ } 

代替

private static volatile MySingletonClass _instance; 

改變它的到

private static volatile Dictionary<string,string> _instance; 

在地方的

_instance = new MySingletonClass(); 

使用

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

用你的函數類似這樣的

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