繁体   English   中英

静态密封类的实现问题

[英]Implementation Problem with Static Sealed Class

我在C#中有一个Sealed类,该类已经存在并且所有方法都是静态的。 它使用xml文件执行一些文件操作。 直到今天,该文件名都已硬编码为源代码。 现在,需求需要将其保存在配置文件中。

问题是:由于类是提取的,所以我需要公开一些静态的“ Initialize”方法来将文件名分配给一些本地静态文件名变量,该变量将替换硬编码的字符串。 因此,我始终必须确保首先调用Initialize,然后再调用它。 因此,更好的方法是拥有我不能写的构造函数。

我想要一种更好的方法来确保类型安全。

如果文件名字段是静态的,则可以将其设置为属性或方法,并确保getter可以从配置文件中进行初始化(如果尚未初始化)。

这样,您不必通过方法显式初始化类,就可以访问属性本身来初始化值。

像下面这样。

static string FileName { get { return (_field ?? _field = GetFileName()); } }

static string GetFileName() { /* TODO: Return filename from config */ }

为什么不能使用静态构造函数?

您可以编写一个静态构造函数以在引用静态成员之前初始化路径。

更多信息可以在这里找到

如果类本身不知道如何访问配置,我将使用一次性设置器:

private static string _filename;
public static string Filename
{
  get
  {
    if(_filename==null)
      throw new InvalidOperationException("Filename not set");
    return _filename;
  }
  set
  {
    if(_filename!=null)
      throw new InvalidOperationException("Filename set twice");
    _filename=value;
  }
}

或者,如果类可以直接访问配置,则更加简单:

private static readonly string Filename;
static MyClassName()
{
  Filename=GetFilenameFromConfig();
}

只需在静态构造函数中对其进行初始化即可。

假设配置文件路径是已知的(即该类不接受任何形式参数),则静态构造函数可能会有所帮助。

您可以通过以下方式更改当前课程:-

public static Foo
{
    public static void Execute()
    {
        const string FileName = "foo.xml";
        // ...
    }
}

public static Foo
{
    public static void Execute()
    {
        Execute("foo.xml");
    }

    public static void Execute(string fileName)
    {
        // ...
    }
}

当前的代码客户端可以继续使用原始方法(硬编码的文件名),并且将文件名作为配置项的任何新客户端都可以使用将文件名作为参数的新方法。 或者,如果您决定所有客户端都应使用新方法,则可以更改它们以执行此操作并删除旧方法。

最简单的选择是添加静态构造函数。 那将在任何其他代码之前执行:

public static class Foo
{
    static Foo()
    {
        // Initialization code
    }

    // Other methods which can depend on initialization code having run
}

正如我所说,这是最简单的-就现有代码的更改而言。 但是,这样的代码往往很难调试,并且如果您有很多相互依赖的静态构造函数,则可能会遇到一些棘手的情况(特别是如果您具有循环依赖性)。 例如,请观看NDC 2010“ C#Puzzlers”视频 -Eric Lippert和Neal Gafter的精彩演讲。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM