[英]Static variable population best practice
我有一个Meterage类,希望可以快速实例化几次。 每个类都需要知道dropbox文件夹在执行机器中的位置,我有相应的代码。
该类当前具有一个变量:
private string dropboxPath = string.Empty;
来保持路径,但我正在考虑将其设为静态,以节省重复执行
this.LocateDropboxFolder();
在构造函数中。 但是,我对转换有点担心:如果两个构造函数尝试同时设置它会怎样? 构造函数中的此代码是否安全(在此示例中,LocateDropboxFolder也变为静态):
public Meterage()
{
if (dropboxPath == string.Empty)
{
LocateDropboxFolder();
}
}
我认为我的担忧可能无关紧要,只要我没有在多个线程中进行构造?
如果将字段设为静态,则静态字段初始化程序或静态构造函数是初始化它们的简便方法。 这将以线程安全的方式最多执行一次。
private static string dropboxPath;
static Meterage()
{
LocateDropboxFolder();
}
如果您不想重新分配该字段,建议您使用readonly
修饰符,则代码应如下所示:
private static readonly string dropboxPath;
static Meterage()
{
dropboxPath = LocateDropboxFolder();
}
在这种情况下, LocateDropboxFolder
需要返回一个字符串。
在构造函数外部声明的变量在构造函数之前先求值。 然后,构造函数将对其进行评估。
请记住,最终将只有一个dropBoxPath
。 如果有此目的,则可以这样做。 (可选)将LocateDropboxFolder
静态方法,然后从static
构造函数中调用它。
如果要防止其他构造函数覆盖默认构造函数,请尝试以下操作:
if (string.IsNullOrEmpty(dropboxPath))
{
LocateDropboxFolder();
}
或者,在static
构造函数中(最多调用一次):
static Meterage()
{
LocateDropboxFolder();
}
private static LocateDropboxFolder()
{
...
}
如果您的代码正在同步执行,那么您的示例将是安全的。 如果创建了多个实例,则将按其创建顺序调用其构造函数。
在第一次运行时,将执行LocateDropboxFolder()
。 完成后,将设置dropboxPath
。
在第二次构造函数执行时, LocateDropboxFolder()
将不会执行,因为dropboxPath
将不再等于string.Empty
(提供的“ LocateDropboxFolder()”不会返回string.Empty
。
然而,如果LocateDropboxFolder()
是异步或对象被在不同的线程实例化,则有可能建立一个第二Meterage
之前实例dropBoxPath
已由设定LocateDropboxFolder()
函数。 这样,将可能多次调用该函数。
如果您希望防止此类多线程错误,可以考虑使用lock语句 。
如果对象尝试从多个线程中紧接连续构造多次,则可能最终可能会多次运行LocateDropboxFolder
。 只要该方法每次都返回相同的结果,尽管这不成问题,因为它仍将使用相同的值。
另外,如果要在构造函数中设置dropboxPath
的值,则没有必要为其设置默认值。 我只声明它(而不分配它),然后在构造函数中检查null。
我感觉到您的计量表课程违反了单一责任原则。 与文件访问有何关系? 我要说的是,这里有2个问题:您的Meterage,例如FolderLocator。 第二个应该具有一些属性或方法,例如Dropbox,可以使用惰性评估模式。 应该实例化一次,并且可以将此单个实例注入到每个Metarage实例中。
也许不是FolderLocator,而是文件系统具有比单个属性更多的方法? 不知道你在做什么。 无论如何-为此建立一个接口。 这样就可以进行单元测试,而无需使用实际的Dropbox文件夹。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.