我需要在两个静态对象之间共享一个对象实例,如下所述。我第一次调用属性MyProperty
时,我必须实例化MyObject
。
作为一个聪明的读者,你已经找到了这个bug。我第一次使用First
,我会实例化MyProperty
,第一次使用Second
时,我会实例化MyProperty
。这是重新初始化它并且放松了这个对象的所有状态。
public static class First
{
static First() { MyProperty = new MyObject(); }
public static MyProperty{ get; set; }
}
public static class Second
{
static Second() { MyProperty = new MyObject(); }
public static MyProperty
{
get { return First.MyProperty; }
set { First.MyProperty= value; }
}
}
这种情况下的解决方案只是检查无效性:
static Second()
{
if(MyProperty == null) MyProperty = new MyObject();
}
但是,对我来说有一股气味。我有一种糟糕的代码感觉。所以我的问题是:是否有一种模式或一些好的建议来共享两个静态对象之间的上下文?
答案 0 :(得分:1)
是的 - 有一种模式,它叫做Singleton
在这里查看第5个解决方案http://www.yoda.arachsys.com/csharp/singleton.html
答案 1 :(得分:1)
您不需要Second
构造函数,因为First.MyProperty
只要您访问First
就会被Second
初始化,无论是通过Factory
还是“直接”。但是,正如Daniel评论的那样,您可以考虑使用实例。有状态的静电也是一种气味。
作为替代方案,您可以考虑创建MyObject
,其构造函数采用First
。此工厂提供了两种构建Second
和MyObject
实例的方法,{{1}}传递给它们。这确实要求你传递实例而不是访问静态类,我必须承认这不太方便。
答案 2 :(得分:-1)
public static class First
{
private Static MyObject _myproperty;
static First() {}
public static MyProperty
{
get
{
if(_myproperty == null) _myproperty = new MyObject();
return _myproperty;
}
set { _myproperty = value; }
}
}
public static class Second
{
static Second() {}
public static MyProperty
{
get { return First.MyProperty; }
set { First.MyProperty= value; }
}
}
如果你真的想这样做的话。但是......为什么不首先访问First.Myproperty?对我而言,通过Second访问First的属性是错误的。