2

我在类库中有以下代码:

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;

4

2 回答 2

3

目录扫描只发生在实例构造函数中。实例构造函数只在new Manager()使用时发生(假设没有人用反射作弊),它只发生一次,在静态字段初始化器中。

所以不行。它应该只发生一次 - 每个应用程序域的第一次。

但是,您可以坚持一个断点/某种输出,然后找出...

于 2012-10-22T07:13:05.787 回答
1

当您第一次Manager访问该类(它的实例或其静态方法和字段)时,静态构造函数将运行并初始化该字段。 所以下次访问该字段时,它会被初始化并且不会运行。Managerinstance
instancenew Manager()

事实上,C# 编译器会自动将字段初始化移动到类构造函数中。以下代码

private static readonly Manager instance = new Manager();

将转换为:

private static readonly Manager instance;
static Manager()
{
    instance = new Manager();
}
于 2012-10-22T08:13:36.013 回答