我已经实现了一个效果很好的单身人士......
(像这个例子一样实施:
public sealed class Singleton
{
static Singleton instance=null;
static readonly object padlock = new object();
Singleton()
{
//breakpoint
}
public static Singleton Instance
{
get
{
lock (padlock)
{
Console.WriteLine("test");
if (instance==null)
{
instance = new Singleton();
}
return instance;
}
}
}
}
当Debugger逐步执行构造函数时,锁不再锁定。输出窗口非常,非常,非常频繁地显示测试,然后发生堆栈溢出异常。
我无法发布整个代码,这是一个非常大的例子。 通过以下实现,不会发生错误。
public sealed class Singleton
{
static readonly Singleton instance=new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
有什么问题?如果没有断点,则在任一实现中都不存在错误....
感谢。
迈克尔
答案 0 :(得分:0)
我发现了问题,但不理解......
我有一个tostring方法,这就是问题(使用反射)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Reflection;
namespace Test
{
class Program
{
static void Main(string[] args)
{
Singleton s = Singleton.Instance;
Console.ReadLine();
}
}
class Singleton
{
static Singleton instance = null;
static readonly object padlock = new object();
Singleton()
{
}
public static Singleton Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Singleton();
}
}
return instance;
}
}
public override String ToString()
{
StringBuilder str = new StringBuilder();
object myObject = this;
// werden nicht alle gewünscht Properties angezeigt, müssen ggf. die Bindingflags
// in GetProperties umgesetzt werden http://msdn.microsoft.com/de-de/library/system.reflection.bindingflags%28VS.95%29.aspx
foreach (PropertyInfo info in myObject.GetType().GetProperties())
{
if (info.CanRead)
{
object o = info.GetValue(myObject, null);
if (o != null)
{
// mit typ: o.GetType()
str.Append(info.Name + "\t\t" + o.ToString() + Environment.NewLine);
}
}
}
return str.ToString();
}
}
}