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

C# 基类中受保护的静态属性是否是在派生类之间共享数据的良好实践?,c#,oop,properties,static,C#,Oop,Properties,Static,给定以下具有如下基类的场景: internal class ResolveVariableStrategyBase { ... protected static EntityFieldVariable EntityFieldVariable { get; private set; } protected static EntityPropertyLoader EntityPropertyLoader { get; private set; } protected

给定以下具有如下基类的场景:

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 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();
    }
    ...
}
这真的是个好主意吗

  • 在基类中具有静态属性,以避免为所有派生类编写与基类相同的(内部)构造函数,所有参数设置基类的字段,如下所示:

    内部关系策略(
    EntityFieldVariable EntityFieldVariable,
    EntityPropertyLoader propertyLoader,
    函数调用器函数调用器,
    字符串变量,
    对象实体值, 对象变量值):基(entityFieldVariable、propertyLoader、functionInvoker、variable、entityValue、variableValue)

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


什么是最佳解决方案?

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

在大型代码库中维护这样的全局不变量既单调又容易出错

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

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


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

这是一个快速的解决方法,但是代码的作者可能会有其他的解释,应该听清楚。我对这段代码感觉不好,想知道是否必须更改它。我自己写的,试图将现有功能重构为策略模式,但我并不完全幸运,因为我不确定这些静态属性是否是好的设计。如果它有效,就不要修复它。KISS原则在这里很有帮助,因为我很确定,即使你不想向客户端发布蹩脚的代码,你也不想通过不必要的重构甚至没有被破坏的代码来引入新的未知错误。因此,如果我必须为尚未存在的代码做出设计决策,那么,以这种方式实施它会是一种好的做法吗?不幸的是,有时好的做法会以快速解决方案的方式出现:/只要它有效,我看不出有什么可怕的地方。但它并不完美,可能比在最上层的基类中拥有
静态
成员要好。