2011-11-22 29 views
0

我需要在两个静态对象之间共享一个对象实例,如下所述。我第一次拨打MyProperty,我必须实例化MyObject静态构造函数和共享数据

作为一个聪明的读者,你已经发现了这个错误。我第一次使用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

你为什么要用'static'?它会造成这样的混乱。 –

+0

“气味”并不完全掩盖它:)没有你需要什么行为的背景(对于哪种“静态”是你当前的解决方案),得到一个好的答案是非常棘手的。为什么First和Second都需要是静态的,为什么他们需要引用一个实例类型的同一个引用? –

+0

因为它是应用程序不同部分之间的共享上下文。 –

回答

1

你不需要Second构造,因为First.MyPropertyFirst只要你访问它初始化,没有无论是通过Second还是“直接”。然而,正如丹尼尔评论的那样,你可能会考虑使用实例有状态静力学也是一种气味。

作为替代,您可以考虑创建一个Factory,其构造函数采用MyObject。该工厂提供了两种构建FirstSecond实例的方法,其中MyObject已通过。这确实需要你传递实例而不是访问静态类,我必须承认这不太方便。

+0

是的,你是对的!这太明显了,第一次发现它。谢谢! –

-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?对我来说,通过第二个访问First属性是错误的。

+0

@ -1Guy感谢您发表评论.... –

+0

我不是-1的家伙。然而,我想指出这个实现不是线程安全的。这当然可以。如果后期初始化很重要,并且'MyProperty'不是第一个要访问的属性,'Interlocked'类有助于在需要时以线程安全(并且无锁的猜测)方式交换'_myproperty'的值。 –