C# 这真的是单身吗?
我有一个这样的单身班C# 这真的是单身吗?,c#,singleton,C#,Singleton,我有一个这样的单身班 class UserInteraction { private CustomerInformation _loginDetails; private MusicDetails[] _musicFilesDownloaded; private static volatile UserInteraction _interactionObject = null; private static object
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。这违反了单身汉的法律吗
2) 如果这违反了Singleton的法律,我如何才能禁止重复UserInfo,同时为其赋值
谢谢。不,这并不违反单身汉的“法律”。单例可以保证,某个类最多有一个实例。您可以更改该类的成员并不重要。
顺便说一句:有更好的方法来实现单例。请看这里:不,这并不违反单身汉的“法律”。单例可以保证,某个类最多有一个实例。您可以更改该类的成员并不重要。
顺便说一句:有更好的方法来实现单例。请参见此处:这是一个单身汉。只有一个实例。因此这并不违反法律,我认为你没有一个合理的问题
这是一个单身汉。只有一个实例。因此这并不违反法律,我认为你没有一个合理的问题
UserInteraction
是一个单例UserInfo
可能不是单例。每个AppDomain只能有一个UserInteraction
实例,因此它是一个单实例
你有一个全局可变状态,这是邪恶的。所以我不会写这样的代码
我不确定check-lock-check模式是否保证在.net中工作。但是,当您可以在.NET4中简单地使用
Lazy
时,为什么要使用这样复杂的东西呢 UserInteraction
是一个单例UserInfo
可能不是单例。每个AppDomain只能有一个UserInteraction
实例,因此它是一个单实例
你有一个全局可变状态,这是邪恶的。所以我不会写这样的代码
我不确定check-lock-check模式是否保证在.net中工作。但是,当您可以在.NET4中简单地使用
Lazy
时,为什么要使用这样复杂的东西呢 这是UserInteraction上的单例,而不是UserInfo上的单例。如果您需要UserInfo成为一个单例,那么您需要重构。这是一个关于UserInteraction的单例,而不是关于UserInfo的单例。如果您需要UserInfo成为一个单身汉,那么您需要重构。我认为这些将引导您回答自己的问题:
简而言之,Singleton保证在系统模块之间只共享给定类的一个实例。也许你也应该考虑让UsReFipe成为一个独裁者?这只是一个设计问题,因为两个不同的开发人员将有多种方法来实现相同的最终行为。我认为这些方法将引导您回答自己的问题:
简而言之,Singleton保证在系统模块之间只共享给定类的一个实例。也许你也应该考虑让UsReFipe成为一个独裁者?那只是设计的问题,因为两个不同的开发人员将有多种方法来实现相同的最终行为。因为我们没有使用.net 4:)看起来您的代码不能保证在其他CLI实现上正常工作,因为ECMA内存模型比.net 2.0模型弱。因为我们没有使用.net 4:)看起来您的代码不能保证在其他CLI实现上正常工作,因为ECMA内存模型比.net 2.0模型弱。+1有趣的体系结构/设计问题。=)+1个有趣的架构/设计问题。=)