C# 静态构造函数与数据共享

C# 静态构造函数与数据共享,c#,C#,我需要在两个静态对象之间共享一个对象的实例,如下所述。第一次调用属性MyProperty时,我必须实例化MyObject 作为一个聪明的读者,你已经找到了错误。第一次使用first,我将实例化MyProperty,第一次使用Second,我将实例化MyProperty。这就是重新初始化它并释放此对象的所有状态 public static class First { static First() { MyProperty = new MyObject(); } public sta

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

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

是的-有一种模式,称为Singleton


检查此处的第5个解决方案

您不需要第二个构造函数,因为第一个是
。MyProperty
在您访问它时,会由第一个初始化,无论是通过第二个还是“直接”。但是,正如丹尼尔的评论,您可以考虑使用实例。有状态的静态也是一种气味

作为替代,您可以考虑创建一个<代码>工厂>代码>,其构造函数采用<代码> MyObjult<代码>。此工厂提供两种方法来构建

第一个
第二个
实例,将
MyObject
传递给它们。这确实需要传递实例,而不是访问静态类,我必须承认这不太方便

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; }
    }
}

如果你真的想这样做。但是为什么不先访问.Myproperty呢?对我来说,通过Second访问First的属性是错误的。

为什么要使用
static
?它会造成这样的混乱。因为它是应用程序不同部分之间的共享上下文。“气味”并没有完全涵盖它:)如果没有您需要的行为背景(对于
静态
是您当前的解决方案),很难得到一个好的答案。为什么第一个和第二个都需要是静态的,为什么它们需要引用实例类型的同一引用?如果必须使用静态的。。将它放在一个单独的静态类中,并在该类的静态构造函数中初始化它。。因此,无论调用方是谁,它都会在第一次调用静态类时启动。。是的,你是对的!这太明显了,第一次就发现不了。非常感谢。我不是一号人物。然而,我想指出,这个实现不是线程安全的。这当然可以。如果延迟初始化很重要,并且
MyProperty
不是第一个要访问的属性,
Interlocked
类有助于在需要时以线程安全(我想也是无锁)的方式交换
\MyProperty
的值