我有一个像这样的单身人士课。
class UserInteraction
{
private CustomerInformation _loginDetails;
private MusicDetails[] _musicFilesDownloaded;
private static volatile UserInteraction _interactionObject = null;
private static object syncRoot = new Object();
private UserInteraction()
{
}
public static UserInteraction Instance
{
get
{
if (_interactionObject == null)
{
lock (syncRoot)
{
if (_interactionObject == null)
_interactionObject = new UserInteraction();
}
}
return _interactionObject;
}
}
public CustomerInformation UserInfo
{
get
{
return _loginDetails;
}
set
{
_loginDetails = value;
}
}
public MusicDetails[] FilesDownloaded
{
get
{
return _musicFilesDownloaded;
}
set
{
_musicFilesDownloaded= value;
}
}
public void PurgeContents()
{
}
public void SerializeValues()
{
}
}
我可以使用以下代码访问此单例类
UserInteraction.Instance.UserInfo.CardData = "";
我的问题如下
1)正如您所看到的,我可以读/写UserInfo结构,这意味着我可以使用任意数量的UserInfo副本。这违反了SingleTon的法律吗?
2)如果这违反了Singleton的法律,如何在禁止UserInfo复制的同时为其分配值?
感谢。
答案 0 :(得分:3)
UserInteraction
是一个单身人士。 UserInfo
可能不是单身人士。每个AppDomain只能有一个UserInteraction
个实例,因此它是一个单例。
你有全局可变状态,这是邪恶的。所以我不会写那样的代码。
我不确定检查锁定检查模式是否可以保证在.net中工作。但是,当你只需在.net 4中使用Lazy<T>
时,为什么要使用这样复杂的东西呢? http://csharpindepth.com/Articles/General/Singleton.aspx
答案 1 :(得分:2)
不,这不违反辛格尔顿的“法律”。单例保证,您最多只能拥有某个类的一个实例。你可以改变那个班级的成员并不重要 顺便说一句:有更好的方法来实现单身人士。见这里:http://csharpindepth.com/Articles/General/Singleton.aspx
答案 2 :(得分:1)
这是UserInteraction上的单例,而不是UserInfo上的单例。如果你需要UserInfo是一个单例,那么你需要重构。
答案 3 :(得分:1)
我认为这些将指导您回答自己的问题:
简而言之,Singleton保证您的系统模块之间只共享一个给定类的实例。也许您应该考虑使UserInfo也成为单身人士吗?这只是设计问题,因为两个不同的开发人员将有多种方法来实现相同的最终行为。
答案 4 :(得分:0)
这是一个单身人士。唯一一个实例。因此,我不认为你有一个有效的问题。