基类中受保护的静态属性是在派生类之间共享数据的良好实践吗?

时间:2016-03-01 10:23:45

标签: c# oop properties static

给出以下基类的场景:

internal class ResolveVariableStrategyBase
{ 
    ...
    protected static EntityFieldVariable EntityFieldVariable { get; private set; }
    protected static EntityPropertyLoader EntityPropertyLoader { get; private set; }
    protected static FunctionInvoker FunctionInvoker { get; private set; }

    protected static string Variable { get; private set; }
    protected static object EntityValue { get; private set; }
    protected static object VariableValue { get; set; }
    ...
    protected ResolveVariableStrategyBase() { } 

    internal ResolveVariableStrategyBase(
        EntityFieldVariable entityFieldVariable,
        EntityPropertyLoader propertyLoader,
        FunctionInvoker functionInvoker,
        string variable,            
        object entityValue,
        object variableValue)
    { ... }

    internal virtual object Execute() { ... } 
}

这样的几个派生类:

internal sealed class RelationStrategy : ResolveVariableStrategyBase
{
    internal override object Execute()
    {
        var result = resolveRelation();
        base.VariableValue = result;

        return resolveRelation();
    }
    ...
}

真是个好主意
  • 在基类中有静态属性,以便为所有派生类编写基本类的相同(内部)构造函数,所有参数都设置基类的字段,如下所示:

    internal RelationStrategy( EntityFieldVariable entityFieldVariable, EntityPropertyLoader propertyLoader, FunctionInvoker functionInvoker, string variable,
    object entityValue, object variableValue) : base (entityFieldVariable,propertyLoader,functionInvoker,variable,entityValue,variableValue)

或者这只是懒惰优先于精心设计的代码吗?

什么是最佳解决方案?

1 个答案:

答案 0 :(得分:1)

这个问题是静态变量跨实例和跨线程共享。这非常容易出错,因为您必须确保全局不变量,即不能同时实例化两个这样的类。此外,递归实例化不再可能(可以说是一个更人为的场景)。

在大型代码库中维护这样的全局不变量是乏味且容易出错的。

我通常使用Resharper生成委托给基础构造函数的构造函数。我认为Alt+Ins, Up, Space, Enter是完全生成所有代码的关键序列。

也许您可以将所有这些值打包到DTO类中,以便更容易传递。 Resharper对管理DTO课程有很大的支持。它可以生成构造函数并使用现有构造函数初始化属性。

在任何情况下,我都会在代码审查中失败该代码。