我在类库中有以下代码:
public class Manager
{
private static readonly Manager instance = new Manager();
public static IHelper Helper { get { return Manager.instance.helper; } }
[Import(typeof(IHelper))]
internal IHelper helper { get; set; }
private Manager()
{
using (DirectoryCatalog catalog =new DirectoryCatalog(@"c:\Dev\Plugins"))
{
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
}
}
我使用上面的类在运行时设置自定义用户界面设置,每次访问成员时都会运行构造函数(是否会扫描目录)?
示例通话可能是lblMask.Text = Helper.SearchMask;
答案 0 :(得分:3)
目录扫描仅在实例构造函数中发生。实例构造函数仅在使用new Manager()
时(假设没有人使用反射作弊),在静态字段初始化程序中只发生一次。
所以:不。它应该只发生一次 - 每个app-domain第一次。
然而,你可以坚持一个断点/某种输出,然后找出......
答案 1 :(得分:1)
当您第一次访问Manager
类 (它的实例或其静态方法和字段)时,Manager
的静态构造函数将运行,初始化instance
字段
因此,下次访问instance
字段时,系统会对其进行初始化,但不会运行new Manager()
。
实际上,C#编译器会自动将字段初始化移动到类构造函数。以下代码
private static readonly Manager instance = new Manager();
将转换为:
private static readonly Manager instance;
static Manager()
{
instance = new Manager();
}