9

我正在努力使用单例设计模式。我正在尝试在这个简单的控制台应用程序中使用它。我在 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 方法时不起作用。因为程序一直显示“有匹配”。但它应该告诉我“没有字符串!!!” 因为没有匹配。那么如何解决呢?

4

5 回答 5

12

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

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

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

编辑:

基于更新的问题。你的 Check 和 Message 是相反的。它应该是:

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

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

于 2013-01-15T04:36:32.520 回答
4

看起来你快到了。考虑像这样重写你的代码:

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# 设计模式教程。

于 2013-01-15T05:04:53.777 回答
4

但是,当我使用 HasMessage 方法时不起作用。因为程序一直显示“有匹配”。但它应该告诉我“没有字符串!!!” 因为没有匹配。那么如何解决呢?

这应该是一个单独的问题,但无论如何我都会回答。你的情况倒退了。如果实例确实包含消息“12”,则您的代码将写入“无字符串”,如果包含消息,则写入“有匹配项” 。尝试这个:

    if(Singleton.Instance.HasMessage("12"))
        Console.WriteLine("There is a match");
    else
        Console.WriteLine("NO STRING!!!");
于 2013-01-15T05:51:07.367 回答
1
private List<String> Messages;

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

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

此外,我建议您为局部变量和成员使用正确的命名约定。更改instancem_Instance和。Messages_ m_Messages还尝试以线程安全的方式实现单例...有关更多信息,请查看此页面

于 2013-01-15T04:40:36.410 回答
0

这就是 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
于 2016-11-15T13:34:38.107 回答