我在C#中有一个Sealed类,它已经存在且所有方法都是静态的。 它使用xml文件执行一些文件操作。直到今天的文件名被硬编码到源代码中。 现在需求需要将其保存在配置文件中。
问题是: 由于类是提取的,我需要公开一些静态的'Initialize'方法,将文件名分配给一些本地静态文件名变量,这将替换硬编码字符串。 所以,我总是要确保,首先调用Initialize,然后调用稍后的方法。 所以,更好的方法是使用构造函数,我不能写。
我想要一种更好的方法来确保类型安全。
答案 0 :(得分:3)
如果文件名字段是静态的,你可以使它成为一个属性或方法,并确保getter完成从配置文件中初始化它的工作(如果它尚未初始化...)
这样你就不必通过一个方法显式初始化类,你可以访问属性本身来初始化值。
下面的东西..
static string FileName { get { return (_field ?? _field = GetFileName()); } }
static string GetFileName() { /* TODO: Return filename from config */ }
答案 1 :(得分:0)
答案 2 :(得分:0)
如果类本身不知道如何访问配置,我会使用一次性设置器:
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();
}
只需在静态构造函数中初始化它。
答案 3 :(得分:0)
假设配置文件路径已知(即类没有正式参数),那么static constructor可能会有所帮助。
答案 4 :(得分:0)
您可以通过以下方式更改当前课程: -
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)
{
// ...
}
}
代码的当前客户端可以继续使用原始方法(硬编码文件名),并且任何具有文件名作为配置项的新客户端都可以使用将文件名作为参数的新方法。或者,如果您已确定所有客户端都应使用新方法,那么您可以更改它们以执行此操作并删除旧方法。
答案 5 :(得分:0)
最简单的选择是添加静态构造函数。这将在任何其他代码之前执行:
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的精彩演讲。