设计模式-如何在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方法时,它不起作用。因为节目一直显示"有一场比赛"。但它应该向我显示"没有字符串!!!",因为没有匹配项那么如何解决呢
您的字段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