C#与“全局”类的范围问题

时间:2017-08-30 13:23:39

标签: c# dictionary scope

我正在尝试将一些全局字典添加到某些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语句时,字典也是空的。我已经尝试将这两个类放在同一个命名空间中,但这不起作用。我的示波器有问题吗?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分: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";
        }
    }