我在C#中有一个密封类,它已经存在,所有方法都是静态的。 它用xml文件进行一些文件操作。直到今天的文件名被硬编码为源代码。 现在需求需要保存在配置文件中。静态密封类的实现问题
问题是: 由于类是提取,我需要公开一些静态'Initialize'方法来分配文件名到一些本地静态文件名变量,这将取代硬编码字符串。 因此,我总是要确定,Initialize先被调用,然后再被调用。 所以,更好的方法是有构造函数,我不能写。
我想要一个更好的方式来确保类型安全。
我在C#中有一个密封类,它已经存在,所有方法都是静态的。 它用xml文件进行一些文件操作。直到今天的文件名被硬编码为源代码。 现在需求需要保存在配置文件中。静态密封类的实现问题
问题是: 由于类是提取,我需要公开一些静态'Initialize'方法来分配文件名到一些本地静态文件名变量,这将取代硬编码字符串。 因此,我总是要确定,Initialize先被调用,然后再被调用。 所以,更好的方法是有构造函数,我不能写。
我想要一个更好的方式来确保类型安全。
如果文件名称字段是静态的,你可以把它的属性或方法,并确保吸气不从,如果它尚未初始化的配置文件进行初始化的工作...
这样,你不必通过方法明确地初始化类,您可以通过访问属性本身来初始化该值。
类似下面..
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();
}
只是在静态构造函数中初始化它。
假设配置文件路径是已知的(即该类没有正式参数),那么static constructor可能会有所帮助。
你可以从像改变你目前的等级: -
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
}
正如我说的,这是最简单的 - 在修改现有代码的条款。然而,像这样的代码往往很难调试,如果你有很多依赖于对方的静态构造函数,你可能会遇到一些棘手的情况(特别是如果你有循环依赖)。举一个例子,请看"C# Puzzlers" video from NDC 2010 - Eric Lippert和Neal Gafter的精彩演讲。
邮政编码,或我们无能为力。 – abelenky 2011-01-11 17:26:24
静态构造函数可以将值分配给静态属性/域。 – asawyer 2011-01-11 17:28:02