我有一个 PluginProvider 类,它使用 PluginLoader 组件从文件系统加载插件(托管/ native )。在 PluginProvider 类中,当前定义了一个名为“PluginTypes”的属性,它调用 get() 上的“InitializePlugins”实例方法。
class PluginProvider
{
IEnumerable<IPluginType> PluginTypes
{
get
{
//isInitialized is set inside InitializePlugins method
if(!isInitialized)
{
InitializePlugins(); //contains thread safe code
}
//_pluginTypes is set within InitializePlugins method
return _pluginTypes;
}
}
}
我正在考虑重构这段代码。我想知道这种初始化是否适合在属性中进行。我知道不能在属性(property)中进行繁重的操作。但是当我检查这个链接时:http://msdn.microsoft.com/en-us/library/vstudio/ms229054.aspx ,发现这个“特别是,访问网络或文件系统的操作(初始化一次除外)最有可能是方法,而不是属性。”。现在我有点困惑。请帮忙。
最佳答案
- 如果您想尽可能地延迟初始化并且您不知道何时您的一个或多个属性将被调用,那么您正在做的事情很好。
- 如果您想延迟并且可以控制第一次调用您的属性的时间,那么您可能希望将您的方法
InitializePlugins()
公开并在访问该属性之前显式调用它.此选项还开启了异步初始化的可能性。例如,您可以有一个返回Task
的InitializePluginsAsync()
。 - 如果延迟初始化不是一个大问题,那么只需在构造函数中执行初始化即可。
关于c# - 在属性内执行初始化是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25236270/