设计模式-如何在C#中使用这个Singleton类

本文关键字:Singleton 设计模式 | 更新日期: 2023-09-27 17:53:22

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

Unhandled Exception: System.NullRefernceException: Object reference not 
  set to an instance of an object.

那么如何解决呢
辛格尔顿类:

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

程序类:

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

更新:

伙计们,到目前为止我真的很感谢你们的帮助。程序正在运行,但逻辑不起作用。如果你看一下主程序,你会发现列表中只有"Hello World!!"。然而,当我使用HasMessage方法时,它不起作用。因为节目一直显示"有一场比赛"。但它应该向我显示"没有字符串!!!",因为没有匹配项那么如何解决呢

设计模式-如何在C#中使用这个Singleton类

您的字段Messages没有初始化为任何内容。这就是为什么你会得到例外。在你的课堂上做:

 private List<string> Messages = new List<string>();

您还可以查看Jon Skeet 的线程安全Singleton实现

编辑:

基于更新的问题。你的支票和短信是相反的。应该是:

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

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

看起来你差不多到了。考虑这样重写代码:

class Singleton
{
    //Variable
    private static Singleton Instance;
    private List<string> Messages;
    //Constructor
    private Singleton() 
    {
     Messages = new List<string>(); //Make sure to instantiate instance types before use. 
    }
    //Property
    public static Singleton GetInstance()
    {
            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);
    }
}

这个网站上有一些关于设计模式的有用的C#教程。

然而,当我使用HasMessage方法时,它不起作用。因为节目一直显示"有一场比赛"。但它应该向我显示"没有字符串!!!",因为没有匹配项那么如何解决呢

这真的应该是一个单独的问题,但无论如何我都会回答的。你的病情已经恶化了。如果实例确实包含消息"12",则您的代码将写"no string";如果实例不包含消息"There are a match",则代码将写。试试这个:

    if(Singleton.Instance.HasMessage("12"))
        Console.WriteLine("There is a match");
    else
        Console.WriteLine("NO STRING!!!");
private List<String> Messages;

这是你的问题。该成员从未在您的代码中被实例化。您可以执行以下操作:

    //Constructor
    private Singleton()
    {
        Messages = new List<string>();
    }

此外,我建议您对局部变量和成员使用适当的命名约定。将instance更改为m_Instance,将Messages更改为m_Messages。还要尝试以线程安全的方式实现singleton。。。欲了解更多信息,请查看本页。

这就是Singleton:的实现

public sealed class SingletonExample
{
    //static Field
    private static SingletonExample _seInstance = null;
    private int _nCounter = 0;
    // private constructor
    private SingletonExample() { _nCounter = 1; }
    //public static get(), with creating only one instance EVER
    public static SingletonExample SeInstance
    { 
        get { return _seInstance ?? (_seInstance = new SingletonExample()); }
    }      
}

如何调用和创建实例?

SingletonExample si1 = SingletonExample.SeInstance;
SingletonExample si2 = SingletonExample.SeInstance; // it will be the same object
System.Diagnostics.Debug.WriteLine(si1.Equals(si2));// TRUE