【问题标题】:Design pattern for properties and static constructor属性和静态构造函数的设计模式
【发布时间】:2016-03-14 13:35:00
【问题描述】:

我有一个带有静态属性和静态构造函数的基类。现在,当我创建派生实例时,我希望将这些属性隔离到该实例(非静态)。我该如何解决这个问题?

【问题讨论】:

  • 你不能派生出任何静态的东西。这就是静态的意思。
  • 不要让它成为静态的?!
  • 我已经有了这个设置的所有代码。我需要一个模式来重构它。
  • 哇,我想知道这个问题的评分有多低。

标签: c# properties constructor static


【解决方案1】:

最好将基类更改为不具有静态属性。如果您希望它们特定于实例,请不要使它们成为静态的。

如果您无法更改基类,您可以在子类中创建新属性并将基类的静态属性的值复制到子类构造函数中的非静态属性,然后使用子类属性代替静态基类属性。

但是,如果您有现有的代码,您无法更改使用基类静态属性的代码,并且您希望以某种方式强制静态属性不再是静态的,那么您就不走运了。

【讨论】:

  • 如果我将属性设为非静态怎么办,向调用非静态属性的基类添加一个非静态构造函数,以及一个由非静态构造函数检查的静态标志,这样它只执行一次?
  • @Drutten 可以工作。锁定检查标志和初始化以确保它确实只完成一次(以防您可能同时有许多线程通过它运行)。
  • 谢谢!它有效,我放了一个很好的锁来确保线程安全。现在只有 ClassInitialize 是静态的问题。也许我还必须用一个标志来解决那个问题(因为我有 100 个标志,这很糟糕)。
【解决方案2】:

更新答案以匹配更新后的问题。

要通过实例类访问静态属性,您可以简单地使用类似的东西:

class SomeClass
{
    private static string staticFoo;

    public string Foo
    {
        get { return SomeClass.staticFoo; }
    }
}

然而,静态构造函数有所不同。您不能手动调用它们,它们会在创建第一个实例或引用静态成员时自动调用一次。 More info on static constructors on MSDN.

更新评论:

我认为这是最接近你想要的。

class SomeClass
{
    private static string staticFoo;

    private string instanceFoo;

    public SomeClass()
    {
        instanceFoo = staticFoo; // Assign the instance variable.
    }

    public static string StaticFoo // Static property.
    {
        get { return staticFoo; }
    }

    public string Foo // Instance property.
    {
        get { return instanceFoo; }
    }
}

【讨论】:

  • 没错,我的错,课程不是静态的。更新了我的问题。
  • 很好,虽然这只会给我静态值,并且对于实例我想要一个非静态值,以便我的并行代码执行不会混合
  • 那么你应该在实例化时赋值,这样它会复制值并且在实例创建后静态值不会影响它
  • 是的,类似的。未实例化的属性应该返回一个静态的,而实例化的应该返回一个非静态的。怎么可能做到?
  • 我更新了我的答案。但是有一个问题:你为什么要同时使用一个类的静态版本和实例版本?我想不出任何好的用例。
【解决方案3】:

好的,回答我自己的问题。所以我设法以这种方式解决它:

public abstract class IntegrationTestBase
{
    private static bool _constructed;

    protected IntegrationTestBase()
    {
        if (_constructed)
        {
            lock (Lock)
            {
                AssignNonStaticProperties();
            }

            return;
        }

        _constructed = true;

        // Do the stuff which was originally in the static constructor, runs only once
        ...
    }
}

为此,我还必须使一堆方法成为非静态方法。 [ClassInitialize] 也有一些问题,必须在静态方法上使用。所以我将它们更改为带有_constructed bool 的默认构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多