Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这真的是单身吗?_C#_Singleton - Fatal编程技术网

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,同时为其赋值


谢谢。

不,这并不违反单身汉的“法律”。单例可以保证,某个类最多有一个实例。您可以更改该类的成员并不重要。

顺便说一句:有更好的方法来实现单例。请看这里:

不,这并不违反单身汉的“法律”。单例可以保证,某个类最多有一个实例。您可以更改该类的成员并不重要。

顺便说一句:有更好的方法来实现单例。请参见此处:

这是一个单身汉。只有一个实例。因此这并不违反法律,我认为你没有一个合理的问题

  • 您可以读/写UserInfo部分,但您是通过singleton来完成的
  • 无效

  • 这是一个单身汉。只有一个实例。因此这并不违反法律,我认为你没有一个合理的问题

  • 您可以读/写UserInfo部分,但您是通过singleton来完成的
  • 无效

  • 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个有趣的架构/设计问题。=)