静态构造函数和共享数据

时间:2011-11-22 13:15:48

标签: c#

我需要在两个静态对象之间共享一个对象实例,如下所述。我第一次调用属性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();
}

但是,对我来说有一股气味。我有一种糟糕的代码感觉。所以我的问题是:是否有一种模式或一些好的建议来共享两个静态对象之间的上下文?

3 个答案:

答案 0 :(得分:1)

是的 - 有一种模式,它叫做Singleton

在这里查看第5个解决方案http://www.yoda.arachsys.com/csharp/singleton.html

答案 1 :(得分:1)

您不需要Second构造函数,因为First.MyProperty只要您访问First就会被Second初始化,无论是通过Factory还是“直接”。但是,正如Daniel评论的那样,您可以考虑使用实例。有状态的静电也是一种气味。

作为替代方案,您可以考虑创建MyObject,其构造函数采用First。此工厂提供了两种构建SecondMyObject实例的方法,{{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的属性是错误的。