如何在C#中使用这个Singleton类?

Tec*_*ver 9 c# design-patterns

我正在努力使用Singleton设计模式.我试图在这个简单的控制台应用程序中使用它.我在Program类的Main方法中遇到了问题.我想从Singleton类定义对象,例如:var data = Singleton.Instance;但我不知道为什么我不能这样做另外,我不知道为什么我在运行程序时收到以下错误消息:

Unhandled Exception: System.NullRefernceException: Object reference not 
  set to an instance of an object.
Run Code Online (Sandbox Code Playgroud)

那么如何解决这个问题呢?
单身人士课程:

namespace Singleton
{
    class Singleton
    {
        //Variable
        private static Singleton instance;
        private List<string> Messages;
        //Constructor
        private Singleton() { }
        //Property
        public static Singleton Instance
        {
            get 
            {
                if (instance == null)
                {
                    instance = new Singleton();
                }
                return instance;
            }
        }
        //Methods
        public void Message(string message)
        {
            Messages.Add(message);
        }

        public bool HasMessage(string message)
        {
            return Messages.Contains(message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

课程类别:

namespace Singleton
{
    class Program
{
    static void Main(string[] args)
    {
        var data = Singleton.Instance;
        Singleton.Instance.Message("Hello World!!!");
        if(Singleton.Instance.HasMessage("12"))
            Console.WriteLine("NO STRING!!!");
        else
            Console.WriteLine("There is a match");

    }
}
}
Run Code Online (Sandbox Code Playgroud)

更新:

伙计们,我非常感谢你们的帮助.该程序现在正在运行,但逻辑不起作用.如果查看主程序,您会看到列表中只有"Hello World !!!".但是,当我使用HasMessage方法时不起作用.因为程序一直显示"有匹配".但它应该告诉我"没有STRING !!!" 因为没有比赛.那么如何解决这个问题呢?

Hab*_*bib 12

您的字段Messages未初始化为任何内容.这就是你得到例外的原因.在你的班上做:

 private List<string> Messages = new List<string>();
Run Code Online (Sandbox Code Playgroud)

您还可以查看Jon Skeet的Thread Safe Singleton实现

编辑:

根据更新的问题.您的支票和信息正好相反.它应该是:

if (Singleton.Instance.HasMessage("12"))
    Console.WriteLine("There is a match");
else
    Console.WriteLine("NO STRING!!!");
Run Code Online (Sandbox Code Playgroud)

HasMessage如果传递的参数存在于列表中,则您的方法返回true,否则返回false.