单例模式(Singleton)不单例?

qingtianzhuren3 2011-09-17 12:31:05
 public class Canshu
{
public bool Is_start = true;
private static Canshu instance = null;
private static readonly object padlock = new object();

[System.Xml.Serialization.XmlIgnore]
public static Canshu Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Canshu();
}
return instance;
}
}
}


}


class A
{
private Canshu canshu = Canshu.Instance;
}

class B
{
private Canshu canshu = Canshu.Instance;
}



为什么在A中修改“this.canshu.Is_start=false;”B中并变化,何故?
...全文
143 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
机器人 2011-09-17
  • 打赏
  • 举报
回复
没看出问题。。。
  • 打赏
  • 举报
回复
晕!

你把 private static Canshu instance 改为 public static Canshu instance,然后在A和B的具体方法中调用 Canshu.instance就行了。

什么“单例”?!
Tim_Andy 2011-09-17
  • 打赏
  • 举报
回复
同意3楼,1楼的没看明白啥意思
qingtianzhuren3 2011-09-17
  • 打赏
  • 举报
回复
谢谢,各位,问题解决,我在canshu里进行反序列化
qingtianzhuren3 2011-09-17
  • 打赏
  • 举报
回复
好像知道原因了,在A中,有序列化和反序列化this.canshu.如果注释掉反序列化,他们都是单例,但是反序列化以后,A中的this.canshu便于B中不是同一个实例了,但是保存数据和序列化又是必须的,这样的虽然找到原因了,但还是没有好的解决一个实例的办法
vrhero 2011-09-17
  • 打赏
  • 举报
回复
1楼的意思是“单例”仅仅是个概念,public static就解决了...你非要照搬几十年前订下的八股文追求形式上的相同...

ps:.NET是纯OO的,没有什么全局变量...
qingtianzhuren3 2011-09-17
  • 打赏
  • 举报
回复
可能是我引用的关系,我是这样引用的
class A
{
private Canshu canshu = Canshu.Instance;
public void judge()
{
B b=new class B();
}
}

class B
{
private Canshu canshu = Canshu.Instance;
}


B是A一个方法中用到的变量,并不是A中的全局变量,3楼的方法也是一样,同时1楼也看不懂所以没回复
threenewbee 2011-09-17
  • 打赏
  • 举报
回复
这个问题怎么总有人问。

CLR via C# 写得很清楚。

如果要在多线程上保证单例能工作,唯一而且经典的做法是预先初始化:

class Singleton
{
private static Singleton instance = new Singleton();
private Singleton() { }
public static Singleton GetInstance() { return instance; }
}


如果你还不明白就去翻书。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧