Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/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# 如何创建Singleton实例的克隆对象?_C#_Singleton - Fatal编程技术网

C# 如何创建Singleton实例的克隆对象?

C# 如何创建Singleton实例的克隆对象?,c#,singleton,C#,Singleton,我的代码中有一个单例类。 在我的主函数中,我创建了该类的一个对象。 然后,我尝试为该对象创建克隆。 而且,它给了我“StackOverflowException” 我的代码看起来像: namespace SingletonApplication { class A : ICloneable { private static readonly A A1 = new A(); public A A2 { get { return A1; } }

我的代码中有一个单例类。
在我的主函数中,我创建了该类的一个对象。
然后,我尝试为该对象创建克隆。
而且,它给了我“StackOverflowException”

我的代码看起来像:

namespace SingletonApplication
{
    class A : ICloneable
    {
        private static readonly A A1 = new A();

        public A A2 { get { return A1; } }
        public object Clone()
        {
            var obj = ((ICloneable)A1).Clone();
            return obj;
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            A obj1 = new A();
            A obj2 = (A)(obj1.Clone());

            Console.WriteLine(object.ReferenceEquals(obj1.A2, obj2.A2));

            Console.ReadKey();
        }

    }
}
错误:
根据定义,Singleton是指在整个应用程序中只有一个实例的类


您得到的
StackOverflowException
是由不断调用自身的
Clone
方法引起的。

根据定义,Singleton是一个在整个应用程序中只有一个实例的类


您得到的
StackOverflowException
是由不断调用自身的
Clone
方法引起的。

与其对同一对象反复递归调用
Clone
,实际上应该做些事情来克隆该对象

通常创建一个新实例并将所有相关属性复制到该实例上。像这样:

A newA = new A();
newA.X = this.X;

return newA;

但是,代码中没有可复制的内容。
readonly
字段将保持原样。我想知道为什么你需要一个单件的副本,因为这违背了设计模式的目的。顺便说一句,你的singleton实现非常独特。我建议您仔细阅读Singleton,并参考其中的一些示例。

不要在同一个对象上反复调用
Clone
,实际上您应该做一些事情来克隆该对象

通常创建一个新实例并将所有相关属性复制到该实例上。像这样:

A newA = new A();
newA.X = this.X;

return newA;

但是,代码中没有可复制的内容。
readonly
字段将保持原样。我想知道为什么你需要一个单件的副本,因为这违背了设计模式的目的。顺便说一句,你的singleton实现非常独特。我建议您仔细阅读Singleton的相关内容,并参考其中的一些示例。

导致此错误的原因是您让Clone自行调用。导致无休止的循环 这不是一个单身汉。单身汉应该是这样的

class A 
    {
        private static A instance;

        private A() { }

        public static A Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new A();
                }
                return instance;
            }
        }
    }

导致此错误的原因是您允许克隆调用自身。导致无休止的循环 这不是一个单身汉。单身汉应该是这样的

class A 
    {
        private static A instance;

        private A() { }

        public static A Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new A();
                }
                return instance;
            }
        }
    }

这些要求相互矛盾:

  • 根据其自身的定义,Singleton最多只能有一个实例
  • Clone()
    方法应该生成一个克隆,一个新的(=第二个)实例
可能更好的解决方案是返回假克隆(即克隆本身)


这些要求相互矛盾:

  • 根据其自身的定义,Singleton最多只能有一个实例
  • Clone()
    方法应该生成一个克隆,一个新的(=第二个)实例
可能更好的解决方案是返回假克隆(即克隆本身)


这不是单音请将您的代码和错误消息复制到您的问题中。这不是单音请将您的代码和错误消息复制到您的问题中。然后是stackoverflow答案[]。。。。。根据设计模式,从来没有打算遵循stackoverflow答案[]中的一个。。。。。根据设计模式,它从来不是有意的