繁体   English   中英

静态变量总体最佳实践

[英]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.

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