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答案[]中的一个。。。。。根据设计模式,它从来不是有意的